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

Как да вмъкна масив в mysql с помощта на PDO и bindParam?

Опитвате се да създадете изявление и да свържете параметър.

Изявленията са страхотни, защото потенциално анулират всякакъв вид SQL инжекция. И го прави, като премахва концепцията, че заявката се вижда само като низ. SQL заявката се разглежда като низ със списък с параметри и свързани данни като обвързани променливи. Така че заявката е не само текст, но и текст + данни.

Имам предвид:

Тази проста заявка:

SELECT * FROM A WHERE val="$param"

Не е безопасно, защото заявката се разглежда само като низ. И ако $param не е отметнат, това е дупка в SQLi.

Но когато създадете изявление, вашата заявка става:

SELECT * FROM A WHERE val=:param

След това използвате bindparam, за да посочите стойността a :param. Което означава, че стойността не е добавена към низа на заявката, но заявката вече е анализирана и данните са предоставени.

Във вашия случай се свързвате с param :array имплодиран масив (предполагам, че "data1", "data2" и т.н.). Което е само един параметър със стойността като низ ( "данни1, данни2, данни3..."), така че ще доведе само до едно вмъкване, а не до множество вмъквания.

Можете да промените генерирането на изявление, като генерирате заявка с достатъчно параметри, за да обработвате вашия масив

$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";

След това завъртете своя масив и извикайте метода bindparam за всеки параметр.

$count = 0;
foreach($values as $val)
{
   $stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
   $count++;

}

Това ще работи.

Редактиране :Това решение показва как работи за едномерен масив, но може лесно да бъде разширено до вашия проблем чрез настройване на генерирането на заявка за израз и модифициране на цикъла bindparam.

Вашето изявление трябва да изглежда така:

$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";

Просто трябва да преброите броя на елемента във вашия основен масив.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL атомарно вмъкване-ако-не-съществува със стабилно автоматично нарастване

  2. ГРЕШКА 2002 (HY000):Не мога да се свържа с локален MySQL сървър чрез сокет '/var/lib/mysql/mysql.sock'

  3. MySQL AS ключова дума

  4. MySQL VARCHAR дължини и UTF-8

  5. как да изберете брой от основната заявка в подзаявка