sql >> Database >  >> RDS >> Mysql

PDO PHP bindValue werkt niet

Het probleem is hier:

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

Ik neem aan dat $regGUID een door komma's gescheiden lijst is van strings tussen aanhalingstekens.

Elke queryparameter accepteert slechts één scalaire waarde. Geen lijsten van waarden.

Je hebt dus twee keuzes:

  1. Ga door met het interpoleren van de $regGUID-tekenreeks, zelfs als u parameters gebruikt voor andere scalaire waarden. Maar je wilt toch voorzichtig zijn om SQL-injectie te vermijden, dus je moet de $ regGUID-tekenreeks correct vormen. Je kunt niet zomaar PDO::quote() aanroepen voor de hele string, dan zou het een enkele string met aanhalingstekens worden die UUID's en komma's bevat. Je moet ervoor zorgen dat elke UUID-tekenreeks een escape-teken heeft en afzonderlijk tussen aanhalingstekens staat, vervolgens de lijst samen implodeert en deze interpoleert in de IN-component.

    $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() de $regGUID in een array en voeg één queryparameter toe voor elk element in de array. Interpoleer de dynamische lijst met tijdelijke aanduidingen voor queryparameters.

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

Je zou kunnen bindValue() in een lus voor de array, maar houd er rekening mee dat andere parameters ook gebonden moeten zijn aan positie, niet aan naam. PDO heeft bugs die het niet leuk maken als je de twee verschillende stijlen van parameters in dezelfde zoekopdracht probeert te mixen.

In plaats van bindValue() te gebruiken, geef ik gewoon een reeks parameterwaarden door aan PDOStatement::execute(), wat veel eenvoudiger is.

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


  1. Regex capture-groepen simuleren in mysql

  2. PHP die een jokerteken bindt

  3. Hoe ORA-01775 te debuggen:een reeks synoniemen in een lus?

  4. Max tabellen &ontwerppatroon