sql >> Base de Datos >  >> RDS >> Mysql

PDO PHP bindValue no funciona

El problema está aquí:

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

Supongo que $regGUID es una lista de cadenas entre comillas separadas por comas.

Cada parámetro de consulta acepta solo un único valor escalar. No listas de valores.

Así que tienes dos opciones:

  1. Continúe interpolando la cadena $regGUID, incluso si usa parámetros para otros valores escalares. Pero aún debe tener cuidado para evitar la inyección de SQL, por lo que debe formar la cadena $regGUID correctamente. No puede simplemente llamar a PDO::quote() en toda la cadena, eso la convertiría en una sola cadena entrecomillada que contiene UUID y comas. Debe asegurarse de que cada cadena UUID se escape y se cite individualmente, luego implosione la lista e interpole en la 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() el $regGUID en una matriz y agregue un parámetro de consulta para cada elemento de la matriz. Interpolar la lista dinámica de marcadores de posición de parámetros de consulta.

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

Puede enlazarValor() en un bucle para la matriz, pero tenga en cuenta que otros parámetros también deben estar enlazados por posición, no por nombre. PDO tiene errores que hacen que no sea feliz cuando intenta mezclar los dos estilos diferentes de parámetros en la misma consulta.

En lugar de usar bindValue(), solo paso una serie de valores de parámetros a PDOStatement::execute(), que es mucho más fácil.

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