Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O PDO PHP bindValue não funciona


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

Suponho que $regGUID seja uma lista separada por vírgulas de strings entre aspas.

Cada parâmetro de consulta aceita apenas um único valor escalar. Não listas de valores.

Então você tem duas opções:

  1. Continue a interpolar a string $regGUID, mesmo se você usar parâmetros para outros valores escalares. Mas você ainda quer ter cuidado para evitar injeção de SQL, então você deve formar a string $regGUID corretamente. Você não pode simplesmente chamar PDO::quote() em toda a string, isso a tornaria uma única string entre aspas contendo UUIDs e vírgulas. Você precisa garantir que cada string UUID seja escapada e citada individualmente e, em seguida, imploda a lista e interpole-a na cláusula 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() o $regGUID em uma matriz e adicione um parâmetro de consulta para cada elemento na matriz. Interpolar a lista dinâmica de marcadores de posição do parâmetro de consulta.
    $regGUIDs = explode(',', $regGUID);
    $params = array_fill(1, count($regGUIDs), '?');
    $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
    

Você pode vincularValue() em um loop para o array, mas lembre-se de que outros parâmetros também devem ser vinculados por posição, não por nome. O PDO tem bugs que o tornam insatisfeito quando você tenta misturar os dois estilos diferentes de parâmetros na mesma consulta.

Em vez de usar bindValue(), apenas passo um array de valores de parâmetro para PDOStatement::execute(), o que é muito mais fácil.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);