Drupal 6 db insert: экранируются строки - PullRequest
0 голосов
/ 24 марта 2011

Схожу с ума от этого ...

Я пытаюсь вставить количество строк в базу данных D6 одним вызовом db_query. Я собрал строки как набор строк, а затем собрал их в одну большую строку, что-то вроде этого:

$theData = "(1, 2, 'a'), (3, 4, 'b'), (5, 6, 'c')";
db_query("insert into {table} (int1, int2, str) values %s", $theData); 

($ theData в моем коде не печатается так; это результат написанного мною кода - большая строка, содержащая наборы значений, заключенные в скобки.)

Когда это запускается, я получаю сообщение об ошибке:

You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 'insert into 
table (int1, int2, str) values (1,2,\'a\' at line 1 query: insert into 
table (int1, int2, str) values (1,2,\'a\'),(3,4,\'n\'),(5,6,\'c\')...

Итак, db_query или кто-то еще экранирует строки перед передачей значений в mysql. Как мне избежать этого? Я мог бы сделать отдельные запросы для каждого набора данных, но это неправильно / дорого по всем очевидным причинам. Спасибо!

1 Ответ

1 голос
/ 24 марта 2011
$theDatas = array("(1, 2, 'a')", "(3, 4, 'b')", "(5, 6, 'c')");

foreach($theDatas as $data) {
  db_query("insert into {table} (int1, int2, str) values %s", $data);
}

Но делать это не рекомендуется, вместо этого вы должны:

$theDatas = array(array(1, 2, 'a'), array(3, 4, 'b'), array(5, 6, 'c'));

foreach($theDatas as $data) {
  db_query("insert into {table} (int1, int2, str) values (%d, %d, '%s')", $data[0], $data[1], $data[2]);
}

Или вы можете сериализовать ($ theData) и поместить его в текстовое поле формата как одно значение, а затем использовать unserialize () для восстановления массива - этот способ рекомендуется, если вы хотите хранить только данные (без поиска, индексации и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...