Mysql
 sql >> база данни >  >> RDS >> Mysql

PDO PHP bindValue не работи

Проблемът е тук:

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

Предполагам, че $regGUID е разделен със запетая списък с низове в кавички.

Всеки параметър на заявката приема само една скаларна стойност. Не списъци на ценности.

Така че имате два избора:

  1. Продължете да интерполирате низа $regGUID, дори ако използвате параметри за други скаларни стойности. Но все пак искате да внимавате да избегнете SQL инжектиране, така че трябва да формирате правилно низа $regGUID. Не можете просто да извикате PDO::quote() на целия низ, това би го направило низ с единични кавички, съдържащ UUID и запетаи. Трябва да се уверите, че всеки UUID низ е екраниран и цитиран поотделно, след това да имплодирате списъка заедно и да го интерполирате в клаузата 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 в масив и добавете един параметър на заявка за всеки елемент в масива. Интерполирайте динамичния списък с заместители на параметри на заявката.

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

Можете да bindValue() в цикъл за масива, но имайте предвид, че другите параметри също трябва да бъдат обвързани с позиция, а не с име. PDO има грешки, които не го правят щастлив, когато се опитате да смесите двата различни стила на параметри в една и съща заявка.

Вместо да използвам bindValue() просто предавам масив от стойности на параметри към PDOStatement::execute(), което е много по-лесно.

$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. пребройте разликата в датата в часове с помощта на php и mysql

  2. MySQL търсене в списъка със запетая

  3. MIN/MAX спрямо ORDER BY и LIMIT

  4. Как да преименувате две таблици в една атомна операция в MySQL

  5. Някой има ли сериозно доказателство, че CHAR е по-бърз от VARCHAR?