2012-04-13 11 views
2

Ich habe eine Abfrage (PHP, MySQL) eine Tabelle 'table' genannt, der wie folgt aussieht:pdo - vorbereitete Anweisung verliert Daten?

id | name 
------------- 
    6 | abc 
    10| xxx 
    52| def 

Und eine Abfrage:

$ids = '5,62' 

$name = $pdo -> prepare('SELECT id, name FROM table WHERE id IN (:ids)'); 
$name -> bindValue(':ids', $ids, PDO::PARAM_STR); 
$name -> execute(); 
$name = $name->fetchAll(PDO::FETCH_ASSOC); 
print_r($nazwa); 

Ich würde erwarten, ein Ergebnis wie

zu erhalten
id | name 
------------- 
    6 | abc 
    52| def 

Unofrtunately erhalte ich nur:

id | name 
------------- 
    6 | abc 

Als wäre der zweite Wert ignoriert. Wenn ich die Abfrage zu ändern:

$name = $pdo -> prepare('SELECT id, name FROM table WHERE id IN (' $ids ')'); 

Es geht alles richtig. Können Sie mir sagen, warum eine vorbereitete Aussage die implodierte Tabelle nicht mit Kommas betrachtet?

+2

Zwei Parameter ist kein Parameter; 'bindValue' ist ein Parameter. Wenn dieser Wert Werte für zwei Parameter enthält, verwenden Sie das falsche Tool. Und ja, das wurde schon mal gefragt. "IN()" plus vorbereitete Anweisungen, z.B. hier ein Beispiel für eine variable Anzahl von Parametern und PDO: http://StackOverflow.com/A/7128193/367456 – hakre

+0

Ich habe gelesen, dass Sie Link zur Verfügung gestellt, aber es macht mich immer noch nicht auf meinem Weg, um das Problem zu lösen. Für mich ist "bind" eine Variable, die ich zu einer früher gemachten Abfrage gesetzt habe. Und ich diese Case-String '6, 52' ist nur eine andere Zeichenfolge, die zwischen (und) in MySQL-Abfrage platziert wird. Ich sehe nicht, dass es zwei, drei und mehr Parameter sind. Ich weiß nicht, warum ich es auf dieser Ebene als 2 oder mehr behandeln sollte. Sorry dafür - ich bin neu in pdo – Kalreg

Antwort

2

Da das Kommentarfeld erlaubt es nicht, dass gut zu schreiben, hier eine Antwort, die nur ein Kommentar:

Angenommen, Sie haben zwei IDs haben:

$name = $pdo->prepare('SELECT id, name FROM table WHERE id IN (:id1, :id2)'); 

Angenommen, Sie haben drei IDs haben:

$name = $pdo->prepare('SELECT id, name FROM table WHERE id IN (:id1, :id2, :id3)'); 

Sie sehen das Muster? Sie haben so viele Werte wie Sie IDs haben. Formulieren Sie die Prepare-Anweisung und führen Sie die Bind-Anweisungen entsprechend der Anzahl der vorhandenen IDs aus.

Die Antwort lautet also: Sie müssen Ihren Code so ändern, dass er die Anzahl der IDs widerspiegelt, die Sie verarbeiten möchten. Der MySQL-Server interpretiert eine durch Kommas getrennte Liste in einer Zeichenfolge nicht als mehrere IDs. Stattdessen müssen Sie dem Server jede einzelne ID mitteilen.

+0

ja, es ist jetzt viel klarer :) danke. Immer noch muss ich herausfinden, wie man eine richtige Menge von IDs abbildet, weil sie manchmal 2 IDs und ein anderes Mal 25 sind. Aber ich denke, der einfachste Weg ist, bindValue in foreach loop zu legen. Danke nochmal. – Kalreg

+0

Ja, 'Array's sind Ihre Freunde für eine variable Anzahl von IDs. Schleifen, implodieren und so. Außerdem gibt es benannte und positionale Parameter mit PDO. Schau dir an, was am besten zu deinen Bedürfnissen passt. – hakre

Verwandte Themen