Корректное составление запроса к БД(db_placeholders()??)

Главные вкладки

Аватар пользователя Tisar Tisar 15 сентября 2010 в 23:21

Подскажите пожалуйста как правильно составить запрос в БД?

<?php
global $user;
$userid $user->uid;
for(
$i=0;$i<=round($NumberDays);$i++)
{
    foreach(
$NamesArray as $Name)
    {
        
$Query_NewTask[]="('".($DateStart+86400*$i)."', '".$form_state['values']['Numbe']."', '".trim($Name)."', '".$userid."')";
    }
}
$result db_query("INSERT INTO {xxx} (Date, Number, Name, IDUser) VALUES %b"implode(','$Query_NewTask));
?>

Результат отправки запроса к БД

<?php
query
INSERT INTO xxx (DateNumberNameIDUserVALUES '(\'1284573600\', \'6666\', \'BigsHunter\', \'1\'), (\'1284573600\', \'6666\', \'MyGod\', \'1\'), (\'1284573600\', \'6666\', \'Ishnnn\', \'1\'), (\'1284573600\', \'6666\', \'Keleginn\', \'1\'), (\'1284573600\', \'6666\', \'Andromargas\', \'1\'), (\'1284660000\', \'6666\', \'BigsHunter\', \'1\'), (\'1284660000\', \'6666\', \'MyGod\', \'1\'), (\'1284660000\', \'6666\', \'Ishnnn\', \'1\'), (\'1284660000\', \'6666\', \'Keleginn\', \'1\'), (\'1284660000\', \'6666\', \'Andromargas\', \'1\'), (\'1284746400\', \'6666\', \'BigsHunter\', \'1\'), (\'1284746400\', \'6666\', \'MyGod\', \'1\'), (\'1284746400\', \'6666\', \'Ishnnn\', \'1\'), (\'1284746400\', \'6666\', \'Keleginn\', \'1\'), (\'1284746400\', \'6666\', \'Andromargas\', \'1\')'
error:You have an error in your SQL syntaxcheck the manual that corresponds to your MySQL server version for the right syntax to use near ''(\'1284573600\', \'6666\', \'BigsHunter\', \'1\'), (\'1284573600\', \'6666\', \' at line 1
?>

Как я понимаю в Drupal`е закавычивать параметры при создания запроса к БД ненужно, Drupal самостоятельно это выполнить использую шаблоны для подстановки. Для создания шаблона автоматически, нужно использовать функцию db_placeholders(). Но как сделать чтобы при создание шаблона создавалась ещё скобки ограничивающие параметры вставляемой строки? Количество строк вставляемых в таблицу заранее не известно.

На данный момент вижу только следующий вариант: После определение количества вставляемых строк дописывать требуемое количество (db_placeholders()), (db_placeholders()) и т.д.
Либо ваши предложения по реализации данного запроса?

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 15 сентября 2010 в 23:44

"Tisar" wrote:
После определение количества вставляемых строк дописывать требуемое количество (db_placeholders()), (db_placeholders()) и т.д.

Делать вам нефиг, посмотрите ядрёные модули, всё поймёте

Аватар пользователя Tisar Tisar 16 сентября 2010 в 19:31

"vgoodvin" wrote:
http://drupaldance.com/lessons/secure-code-database-layer[/quote]
Вот именно эта статья и навеяла заняться заняться подобным.
"RxB" wrote:
Делать вам нефиг, посмотрите ядрёные модули, всё поймёте

Я не очень силён в MySQL, хотелось бы узнать можно реализовать следующее и ли всё таки бросить маяться ерундой?
Пример:
В таблице одним запросом создаётся допустим 100 строк состоящих из 10 ячеек каждая, 8 из них для всего запроса одинаковые, изменяются данные только для 2-х ячеек. Можно ли как нибудь вместо отправки 80% одинаковых данных для каждой строки отправлять только изменяемые данные т.е.
1) в запрос записываются постоянные данные для всех строк;
2) записываются данные различные для каждой строки.

"RxB" wrote:
Делать вам нефиг, посмотрите ядрёные модули, всё поймёте

т.е. там забивают на "безопасность"?

Аватар пользователя vgoodvin vgoodvin 16 сентября 2010 в 20:49

"Tisar" wrote:
т.е. там забивают на "безопасность"?

От инекций защита есть, а что еще вам надо?

"Tisar" wrote:
Я не очень силён в MySQL, хотелось бы узнать можно реализовать следующее и ли всё таки бросить маяться ерундой?

Я вас не совсем понял. Просто я на данный момент из реляционок наоборот только с MySQL работал.
Что вам мешает сделать вот так:

$args = array(
  $static_val0,
  $static_val1,
  $static_val2,
  $static_val3,
  $static_val4,
  $static_val5,
  $static_val6,
  $static_val7,
  $dynamic_val0,
  $dynamic_val1,
);
db_query("INSERT INTO {some_table} VALUES (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", $args);

?