Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO PHP bindValue funktioniert nicht

Das Problem ist hier:

$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);

Ich gehe davon aus, dass $regGUID eine durch Kommas getrennte Liste von Strings in Anführungszeichen ist.

Jeder Abfrageparameter akzeptiert nur einen einzelnen Skalarwert. Keine Listen von Werten.

Sie haben also zwei Möglichkeiten:

  1. Interpolieren Sie weiterhin die $regGUID-Zeichenfolge, auch wenn Sie Parameter für andere Skalarwerte verwenden. Aber Sie sollten trotzdem vorsichtig sein, um eine SQL-Einschleusung zu vermeiden, also müssen Sie den $regGUID-String richtig bilden. Sie können PDO::quote() nicht einfach für den gesamten String aufrufen, das würde es zu einem einzelnen String in Anführungszeichen machen, der UUIDs und Kommas enthält. Sie müssen sicherstellen, dass jeder UUID-String einzeln maskiert und in Anführungszeichen gesetzt wird, dann die Liste zusammen implodieren und in die IN-Klausel interpolieren.

    $regGUIDs = explode(',', $regGUID);
    $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs);
    $regGUID = implode(',', $regGUIDs);
    $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
    
  2. explode() die $regGUID in ein Array und fügen Sie für jedes Element im Array einen Abfrageparameter hinzu. Interpolieren Sie die dynamische Liste der Platzhalter für Abfrageparameter.

    $regGUIDs = explode(',', $regGUID);
    $params = array_fill(1, count($regGUIDs), '?');
    $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
    

Sie könnten bindValue() in einer Schleife für das Array verwenden, aber denken Sie daran, dass andere Parameter auch an die Position und nicht an den Namen gebunden werden sollten. PDO hat Fehler, die es nicht glücklich machen, wenn Sie versuchen, die zwei verschiedenen Arten von Parametern in derselben Abfrage zu mischen.

Anstatt bindValue() zu verwenden, übergebe ich einfach ein Array von Parameterwerten an PDOStatement::execute(), was viel einfacher ist.

$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);