Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PDO PHP bindValue nie działa

Problem jest tutaj:

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

Zakładam, że $regGUID to rozdzielona przecinkami lista ciągów w cudzysłowie.

Każdy parametr zapytania akceptuje tylko jedną wartość skalarną. Nie listy wartości.

Masz więc dwie możliwości:

  1. Kontynuuj interpolację ciągu $regGUID, nawet jeśli używasz parametrów dla innych wartości skalarnych. Ale nadal chcesz uważać, aby uniknąć wstrzyknięcia SQL, więc musisz poprawnie utworzyć ciąg $regGUID. Nie możesz po prostu wywołać PDO::quote() na całym łańcuchu, co uczyniłoby go pojedynczym łańcuchem w cudzysłowie zawierającym UUID i przecinki. Musisz upewnić się, że każdy łańcuch UUID jest escapowany i cytowany indywidualnie, a następnie implodować listę razem i interpolować ją do klauzuli 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 do tablicy i dodaj jeden parametr zapytania dla każdego elementu w tablicy. Interpoluj dynamiczną listę symboli zastępczych parametrów zapytania.

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

Możesz bindValue() w pętli dla tablicy, ale pamiętaj, że inne parametry również powinny być powiązane z pozycją, a nie nazwą. PDO ma błędy, które sprawiają, że nie jest szczęśliwy, gdy próbujesz mieszać dwa różne style parametrów w tym samym zapytaniu.

Zamiast używać bindValue() po prostu przekazuję tablicę wartości parametrów do PDOStatement::execute(), co jest znacznie łatwiejsze.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja LCASE() w MySQL

  2. Przekaż parametry do skryptu MySQL

  3. Jak dodać 1 godzinę do currrent_timestamp w mysql, która jest wartością domyślną?

  4. Jak wykonać kopię zapasową baz danych MySQL z wiersza poleceń w systemie Linux

  5. Ansible idempotentny podręcznik instalacji MySQL