2016-07-20 3 views
2

Ich bin neu in PHP PDO und zu versuchen, verwenden benannte Platzhalter am Ort der ORDER BY ASC laufen. Irgendwann in einfacher Abfrage Seite laufen diese sehr erfolgreich nicht in der Lage, aber in der folgenden Abfrage auszuführen:kann nicht genannt Platzhalter für Bestellung von ASC in PHP gU

PHP-Code ist:

$price_sort = "ASC"; 
$keyword = "samsung glaxy"; 
$limit = 0; 
    $query = $db->prepare("SELECT *, MATCH(title) against (:keyword) as 'relevence' 
       FROM view_store_items_grid 
       WHERE MATCH(title) against(:keyword) 
       ORDER BY relevence DESC, price :order 
       LIMIT :limit,25"); 
    $query->bindValue(":keyword",$keyword); 
    $query->bindValue(":order",$price_sort); 
    $query->bindValue(":limit", $limit, PDO::PARAM_INT); 
    $query->execute(); 

Wenn ich Platzhalter entfernen :order mit ASC diesem Laufe und gibt Ergebnis, aber wenn ich benutze diesen Platzhalter, ich bekomme ein leeres Ergebnis.

Für Abrufen von Daten oder abgerufenen Ergebnis zu zeigen, ich bin mit

while ($row = $query->fetch(PDO::FETCH_ASSOC)) : 
     extract($row); 
     echo "$name"; 
endwhile; 

Was ich falsch mache und wie ich viele namens Platzhalter in Abfrage an verschiedenen Orten nutzen können?

+1

Sie keine benannten Parameter-Markierung mit dem gleichen Namen mehr als einmal in einer vorbereiteten Erklärung – Saty

+0

Sie meinen, verwenden kann ich zwei verschiedene Platzhalter am Ort des 'verwenden soll: Stichwort "? –

+0

Versuchen Sie es mit anderen Platzhalter von 'Schlüsselwort' – Saty

Antwort

2

Sie sollten ASC/DESC nicht in vorbereiteter Anweisung binden. Parameter werden automatisch zitiert, und ASC/DESC sollte nicht zitiert werden. Aus demselben Grund können Tabellen- und Spaltennamen keine Parameter sein.

Stattdessen können Sie wie tun, dass

$sql_query = "SELECT *, MATCH(title) against (:keyword) as 'relevence' 
       FROM view_store_items_grid 
       WHERE MATCH(title) against(:keyword) 
       ORDER BY relevence DESC, price " 
if($price_order == 'ASC'){ 
    $sql_query .= " ASC " 
}else{ 
    $sql_query .= " DESC " 
} 
$sql_query .= " LIMIT :limit,25 " 
$query = $db->prepare($sql_query); 

Siehe How bindValue in LIMIT

Siehe pdo binding asc/desc order dynamically

Versuchen Sie auch nicht die gleichen benannten Parameter zweimal in einer einzigen SQL-Anweisung zu verwenden, zum Beispiel

<?php 
$sql = 'SELECT * FROM some_table WHERE some_value > :value OR some_value < :value'; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(':value' => 3)); 
?> 

... dies wird Ich gebe keine Zeilen und keinen Fehler zurück - Sie müssen jeden Parameter einmal und nur einmal verwenden. Offensichtlich ist dies das erwartete Verhalten (gemäß diesem Fehlerbericht: http://bugs.php.net/bug.php?id=33886) wegen Portabilitätsproblemen.

+0

Ja. Wenn ich nach ASC tausche, läuft es. Danke für deinen Vorschlag. –

0

Dieser diese Frage gelöst, indem die price_sort Variablenwert mit price ASC ersetzt und die price vor dem placehoder Entfernen :order

wie: ist

$price_sort = "price ASC";

und die Abfrage wie:

$query = $db->prepare("SELECT *, MATCH(title) against (:keyword) as 'relevence' 
       FROM view_store_items_grid 
       WHERE MATCH(title) against(:keyword) 
       ORDER BY relevence DESC, :order 
       LIMIT :limit,25"); 

das löste meine Frage mit Hilfe der Antwort von @tamil

Danke

Verwandte Themen