Çalışmıyor PHP if-then-else

9 Cevap php

Vb "? = 1 sıralama inventory.php" ve: My url gibi bir şeydir. Güzel ama sayfa yüklendiğinde düzgün bilgileri görüntülemek vermez.

mysql_connect("localhost","user","pass"); 
mysql_select_db("database"); 

if ($sorting == 1){
$result = mysql_query("select * from vehicles ORDER BY year DSC");
}
elseif ($sorting == 2){
$result = mysql_query("select * from vehicles ORDER BY make DSC");
}
elseif ($sorting == 3){
$result = mysql_query("select * from vehicles ORDER BY miles DSC");
}
elseif ($sorting == 4){
$result = mysql_query("select * from vehicles ORDER BY downpay DSC");
}
elseif ($sorting == 5){
$result = mysql_query("select * from vehicles ORDER BY pricepay DSC");
}
elseif ($sorting == 6){
$result = mysql_query("select * from vehicles ORDER BY pricecash DSC");
}
else {
$result = mysql_query("select * from vehicles");
}

while($r=mysql_fetch_array($result))

9 Cevap

Sen $sorting $_GET["sorting"] ile değiştirmeniz gerekir

ancak, ayrıca:

O switch deyimini kullanmak daha iyi bir fikir olmaz mıydı?

switch($_GET["sorting"]{
    case 1:
	$result = mysql_query("select * from vehicles ORDER BY year DSC");
	break;
case 2:

vb

Neden sadece GET değişkeni olarak alan adını kullanmak değil mi?

$sortField = $_GET['sorting'];
// Ensure we don't get any SQL injection:
$validFields = array('year', 'make', 'miles' ... 'pricecash');


$sql = "select * from vehicles";

if(in_array($sortField, $validFields)){
    $sql .= ' ORDER BY ' . $sortField .' DESC';
}

mysql_query($sql);

ve sonra vb sıralama = yıl? inventory.php kullanarak sayfaya erişmek

Bu predicatable, URL daha okunabilir hale getirir ve sadece yeni anahtarı durumları yazmak gerek kalmadan diziye ekleyerek yeni alanlar destek anlamına gelir.

Short answer: $sorting $_GET["sorting"] ile değiştirin, ya da kod üstüne $sorting = $_GET['sorting']; ekleyin.

Long answer: Uzun zaman önce, register_globals otomatik URL parametreleri değişkenleri gibi görünmesi için kullanılmıştır. Güvenlik sorunları bir sürü Bu kurşun (yukarıdaki bağlantıyı bir örnek içerir), bu yüzden sonunda varsayılan (PHP 4.2.0) tarafından kapatılmış. PHP 6, bu seçenek artık yok. Böylece, açıkça $_GET veya $_REQUEST ile URL GET parametreleri erişmek gerekir.

Alternatif olarak, açıkça import_request_variables komutunu kullanarak yerel değişkenler içine URL parametrelerini alabilirsiniz.

Ve daha güzel hale getirmek için, bunu yapabilirsiniz:

$sortBy = '';
switch($_GET["sorting"]{
  case 1:
    $sortBy = 'year';
    break;
  case 2:
    $sortBy = 'make';
    break;
  //...
}  

if(!empty($sortBy)) {
  $result = mysql_query('select * from vehicles ORDER BY ' . $sortBy . ' DSC');
}
else {
  $result = mysql_query('select * from vehicles');
}

Bu şekilde, sadece bir gün değiştirmek için varsa bir noktada sorguyu değiştirmek zorunda.

Bazı var mı

$sorting = $_GET['sorting'];

kodunuzu bir yere? Bu otomatik olarak değer almazsınız.

Kodunuzu başında bu satırı ekleyin.

$sorting = $_REQUEST['sorting'];

Sen $ _GET diziden $ sıralama değişken almak gerekir. Ben de böyle bir switch ifadesi olarak yeniden yazmak istiyorum:

switch($_GET['sorting'])
{
  case 1:
    $result = mysql_query("select * from vehicles ORDER BY year DSC");
  brek;

  case 2:
    $result = mysql_query("select * from vehicles ORDER BY make DSC");
  break;

  ...

  default:
    $result = mysql_query("select * from vehicles");
  break;
}

Neden kullanmayın switch:

switch ($sorting) {
    case 1:
        $result = mysql_query("select * from vehicles ORDER BY year DSC");
        break;
    case 2:
        $result = mysql_query("select * from vehicles ORDER BY make DSC");
        break;
    // ...
    default:
        $result = mysql_query("select * from vehicles");
        break;
}

Ayrıca, Emin $sorting atanır olun:

$sorting = $_GET['sorting']; // Place somewhere before the switch

Eğer bu ya get veya post tarafından gelebilir eğer $_GET['sorting'] veya $_REQUEST['sorting'] kullanın, ama neden bunu yapamaz?

$query = "SELECT * FROM `vehicles`";

$sort_values = array( 1 => 'year', 'make', 'miles', 'downpay', 'pricepay', 'pricecash' );
$sort_number = $_GET['sorting'];
if( $sort_number <= count($sort_values) ) {
    $query .= " ORDER BY `{$sort_values[ $sort_number ]}` DESC";
}

$result = mysql_query($query);

note that the 1 => portion of the array is because you 1-indexed your list of queries.
the reason for the <= portion of the if statement is for that reason too -- if you 0-indexed it, you would just use <.

Henüz bunun gibi görünmeyebilir, ancak hızlı bir şekilde denemek ve daha az kod yazmak için yollar bulmak için buna değer olduğunu göreceksiniz. Dizi kullanarak herhangi bir kod (art arda $result = mysql_query(...);, vb yazma) kopyala / yapıştır zorunda değilsiniz ve bu tabloya yeni sütunlar eklemek için neredeyse zahmetsiz, hiç daha fazla bilgi görüntülemek için gereken gerektiği anlamına gelir.

Bir hatta doğrudan veritabanından sütun adlarını almak ve bir daha asla bu kodu dokunmaktan kaçının olabilir.