2016-06-15 6 views
0

ich einige Daten in einem Feld innerhalb MySQL in diesem Format gespeichert: 1,5,9,4
ich dieses Feld mit dem Namen Zusammenhang. Jetzt möchte ich dieses Feld innerhalb einer IN-Klausel mit PDO verwenden. Ich habe diesen Feldinhalt in $related Variable gespeichert. Das ist mein nächster Codes:Wie PDO vorbereitete Anweisungen mit IN-Klausel verwenden?

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (?) LIMIT 4"; 
$q = $db->prepare($sql); 
$q->execute(array($related)); 
echo $q->rowCount(); 

Aber nach Ausführung dieses Codes kann ich nur ein Datensatz holen, während ich 4 Aufzeichnungen zu holen habe (1,5,9,4). Was habe ich falsch gemacht?

+0

Mögliches Duplikat von [FIND \ _IN \ _SET() vs IN()] (http://stackoverflow.com/questions/4155873/find-in-set-vs-in) –

+1

Der allgemeine Pfad ist, ein zu verwenden extra Tabelle für die Beziehung. Dies ist ein schlechtes Datenbankdesign. –

+0

@GeraldSchneider Ich weiß, dass dies nur ein Beispiel für meine Frage ist. –

Antwort

0

Sie benötigen so viele ? Platzhalter als Ihre "IN" -Werte.

So:

$related = array(1,2,3); // your "IN" values 

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN ("; 

$questionmarks = ""; 
for($i=0;$i<count($related);$i++) 
{ 
    $questionmarks .= "?,"; 
} 

$sql .= trim($questionmarks,","); 
$sql .= ") LIMIT 3;"; 

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3; 

$q = $db->prepare($sql); 
$q->execute($related); // edited this line no need to array($related), since $related is already an array 
echo $q->rowCount(); 

https://3v4l.org/No4h1

(auch wenn Sie wollen 4 Aufzeichnungen des LIMIT 3 zurückerhalten los)

Mehr elegant können Sie str_repeat verwenden, um Ihre Platzhalter wie folgt anhängen:

$related = array(1,2,3); // your "IN" values 

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN ("; 
$sql .= trim(str_repeat("?,",count($related)),","); 
$sql .= ") LIMIT 3;"; 

// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3; 

$q = $db->prepare($sql); 
$q->execute($related); // edited this line no need to array($related), since $related is already an array 
echo $q->rowCount(); 

https://3v4l.org/qot2k

Auch durch die wieder Ihre Frage zu lesen, ich kann erraten, dass Ihr $related Variable ist nur ein string mit Wert durch Komma getrennte Zahlen wie 1,40,6,99. Wenn dies der Fall ist, müssen Sie es zu einem array machen. tun: $related = explode($related,",");, um es zu einem Array von Zahlen zu machen. Dann in Ihrer execute Methode übergeben Sie $related wie-ist.