alan adına göre tek fark mysql ifadeleri azaltılması

3 Cevap php

Ben artan ve azalan farklı alanlara göre verileri sıralamak çalışıyorum. Ama ben 4 alanda (8 sorgularını toplam) için farklı mysql pdo ifadeler var:

$stmt1 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 DESC");
$stmt2 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 ASC");
$stmt3 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field2 DESC");
$stmt4 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt5 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 DESC");
$stmt6 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt7 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 DESC");
$stmt8 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 ASC");

Girişine göre, ben sağ deyimi almak ve bağlamak ve çalıştırmak.

if ($sortcode == 1){ 
   $stmt1->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt1->execute();
   $fetched = $stmt1->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 2){
   $stmt2->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt2->execute();
   $fetched = $stmt2->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 3){
   $stmt3->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt3->execute();
   $fetched = $stmt3->fetchAll(PDO::FETCH_ASSOC);
}
//repeat the block 5 more times, for a total of 8

Bu hiç doğru görünmüyor. Select ifadeleri yalnızca alan o isim ve azalan / ASC int farklı olduğundan, $sortcode almak için daha iyi bir yolu ve takip kompakt kod var mı?

I guess I could state the question more specifically as: is there a way I could have a single statement/single pdo statement that binds the field name and asc/decs dynamically?

3 Cevap

Hazırlanan ifadeleri tutmak için ilişkilendirilebilir diziler kullanın.

Sizin girişi sağ, bir sütun ve bir sıralama yöntemdir? Yani tarafından sorguları hazırlar:

$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
foreach($columns as $col) {
  $queries[$column] = array();
  foreach ($orders as $order) {
     $queries[$column][$order] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
  }
}

Şimdi, doğru sorguyu bakmak, bazı sentetik kodu gerekmez - sadece kolon ve sipariş doğrudan tarafından o kadar bak.

Yerine 1-8 kullanıcıların giriş bir dizi sahip, bir sorgu aramak için onlara bir sütun ve bir sipariş girişi var. Sütun değişken $ col ve sipariş $ ord olduğunu düşünün. Sadece $ sorgu [$ col] [$ Ord] söylüyorlar.

Nedense numarayı (neden?) Kullanmak zorunda iseniz, o zaman biraz farklı bir stratejiye ihtiyacımız var. Bu durumda, sorguları by that number saklayın.

$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
$i = 0;
foreach($columns as $col) {
  foreach ($orders as $order) {
     $i = $i + 1;
     $queries[$i] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
  }
}

Diğer bir deyişle, siz onları aramak için planı nasıl uygun sorguları saklamak olmalı.

Sen değiştirgelenebilen sütun numarası ile sipariş edebilirsiniz. Bu şekilde bir ORDER BY kullanarak select yan tümcesinde sütunları belirtirseniz genellikle nettir. Gerçi, ASC / DESC parametreli olabilir emin değilim ...

Her zaman dinamik sorguları oluşturabilirsiniz. $sortcode ile harita ve sütunları, sorgu SELECT * FROM tabname WHERE categ=:categ kısmını, $sortcode dayanan sağ sütun adını almak ve {[(3) ekleyin Mağaza }] parçasıdır.