Mysql
 sql >> Database >  >> RDS >> Mysql

PDO PHP bindValue non funziona

Il problema è qui:

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

Presumo che $regGUID sia un elenco separato da virgole di stringhe tra virgolette.

Ogni parametro di query accetta solo un singolo valore scalare. Non elenchi di valori.

Quindi hai due scelte:

  1. Continua a interpolare la stringa $regGUID, anche se utilizzi parametri per altri valori scalari. Ma vuoi comunque stare attento a evitare l'iniezione SQL, quindi devi formare correttamente la stringa $regGUID. Non puoi semplicemente chiamare PDO::quote() sull'intera stringa, ciò la renderebbe una singola stringa tra virgolette contenente UUID e virgole. Devi assicurarti che ogni stringa UUID sia sottoposta a escape e virgolettata individualmente, quindi implodi l'elenco insieme e interpolalo nella clausola IN.

    $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() $regGUID in un array e aggiungi un parametro di query per ogni elemento nell'array. Interpola l'elenco dinamico dei segnaposto dei parametri di query.

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

Potresti bindValue() in un ciclo per l'array, ma tieni presente che anche altri parametri dovrebbero essere vincolati dalla posizione, non dal nome. PDO ha bug che lo rendono insoddisfatto quando provi a mescolare i due diversi stili di parametri nella stessa query.

Invece di usare bindValue(), passo semplicemente un array di valori di parametro a PDOStatement::execute(), il che è molto più semplice.

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