db_query placeholders

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

Аватар пользователя xom940k xom940k 10 февраля 2012 в 23:50

Всем привет!
Вот офф ссыль, чтобы не быть голословным:
http://api.drupal.org/api/drupal/includes%21database%21database.inc/func...
и там в комментах:

<?php
// Drupal 7
// Notice the place holders are now done using the same syntax as PDOs (:uid)
// Placeholders also don't need to be quoted anymore.
$uid 1;
$result db_query('SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = :uid'
, array(':uid' => $uid));
// Result is returned as a iterable object that returns a stdClass object on each iteration
foreach ($result as $record) {
  
// Perform operations on $record->title, etc. here.
  // in this example the available data would be mapped to object properties:
  // $record->nid, $record->title, $record->created
}

// Same example in Drupal 6
$uid 1;
$result db_query("SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = %d"
$uid);
while (
$record db_fetch_object($result)) {
  
// Perform operations on $record->title, etc. here.
}
// NOTE: db_fetch_object and db_fetch_array have been removed from D7!

?>

Друге! Это нихрена не одно и тоже: :uid и %d
Почитал внимательно вот это:
$args: An array of values to substitute into the query. If the query uses named placeholders, this is an associative array in any order. If the query uses unnamed placeholders (?), this is an indexed array and the order must match the order of placeholders in the query string.
Вначале подумал что (?) - это какойто прикол, мол они сами не знают что это за хрень. Но:
http://api.drupal.org/api/drupal/includes%21database%21database.inc/grou...
оказалось это не именованные placeholders. Кто что думает по поводу безопасности, в связи с этими неочевидными (да нахрена же?!!) изменениями...
ЗЫ: я конечно юзаю init_var, которую написал почти сам (точнее спер, но потом почти всю переписал, в силу убогости), которая берет из $_POST и $_GET (где найдет - там и возмет), да еще и в зависимости от типа (третий параметр) начинает валидировать, если что - дефалт значение (второй параметр). Но вдруг я чтото недописал, в результате SQL иньекции, кто что понял вообще? Время уже ночь...

Комментарии

Аватар пользователя xom940k xom940k 11 февраля 2012 в 2:10

"xxandeadxx" wrote:
что?

раньше можно было не беспокоится за передаваемые в db_query параметры. Сейчас я не вижу аналога Smile Именованные placeholders - это вообще бред по моему...
И что они сделали с кавычками?
Я задам проще вопрос: тестил ли ктонить новый db_query на предмет SQL инъекций?

Аватар пользователя xxandeadxx xxandeadxx 11 февраля 2012 в 2:11

"xom940k" wrote:
раньше можно было не беспокоится за передаваемые в db_query параметры

и сейчас тоже

"xom940k" wrote:
Сейчас я не вижу аналога =)

аналога чего?

"xom940k" wrote:
Именованные placeholders - это вообще бред по моему...

пиши ещё

Аватар пользователя xom940k xom940k 11 февраля 2012 в 2:32

"xxandeadxx" wrote:
аналога чего?

%d, %s
"xxandeadxx" wrote:
пиши ещё

давно пишу

<?php
// 6.x
db_query('SELECT * FROM {node} WHERE nid=%d OR title="%s"'10'blabla');
// 7.x
db_query('SELECT * FROM {node} WHERE nid=:? OR title=:?', array(10'blabla'));
// тут еще длинней и вообще не очевидно для чего
db_query('SELECT * FROM {node} WHERE nid=:id OR title=:title', array('id' => 10'title' => 'blabla'));
?>

в последнем случае наверно улучшится повторное использование и дебаг, но длинна улетает...
Более того, 1, 2 случай, можно поменять местами 10 и 'blabla', в первом случае будет ошибка db_query, во втором не верно выполнится запрос. В 3м случае явно так не получится, но вот что если вместо 10, будем передавать, например, $_POST['nid']?

Аватар пользователя xxandeadxx xxandeadxx 11 февраля 2012 в 2:58

"xom940k" wrote:
Более того, 1, 2 случай, можно поменять местами 10 и 'blabla'

и часто ты меняешь местами?

"xom940k" wrote:
но вот что если вместо 10, будем передавать, например, $_POST['nid']?

дрис дропнет твою базу данных

Аватар пользователя boneg boneg 11 февраля 2012 в 12:15

Кэп думает, что ТС не верит, что в новой версии "абстрогатора" происходит проверка типа данных и автоматическое экранирование.

Цитирю фразу из Database abstraction layer API 7-ки:

The values to place into those placeholders are passed separately, and the database driver handles inserting the values into the query in a secure fashion. That means you should never quote or string-escape a value to be inserted into the query.

"xom940k" wrote:
Именованные placeholders - это вообще бред по моему...

Это вы зря, товарищ. Стало ведь куда удобней. Не нужно читать всю километровую строку вашего запроса, чтобы найти, в какой последовательности вы скармливаете ей подстановочные значения, теперь это видно сразу в аргументе.

Аватар пользователя xom940k xom940k 11 февраля 2012 в 17:28

ну в целом я согласен с вами )
тему создал чтобы пораздуть, да к тому же ночью => воспринимать ее в серьезе не стоит...
просто хотелось получать ошибки не уровня DB, а уровня PHP...
Что скажете про нечно вроде ORM, которую нагородили в 7ке? )
Ктонить юзает?

Аватар пользователя xom940k xom940k 11 февраля 2012 в 18:54

"xom940k" wrote:
Что скажете про нечно вроде ORM

не подумайте, что я с каким либо призрением это говорю...
Просто по опыту schema 6.х, я знаю что встроенными средствами организовать целостность данных в BD нельзя. После утомительного загугливания и прочтения 1000 коментов, я перешел на чистые SQL запросы, вместо того чтобы вначале городить schema, а потом досылать ALTER в сервер, чтобы гарантировать ссылочную целостность таблиц...
В связи с этим впечатлением, у меня с трудом язык поворачивается назвать то, что я увидел в доках ORM, хотя конечно объекты, абстракция и БД - там присутствует Biggrin

Аватар пользователя boneg boneg 11 февраля 2012 в 22:12

"xom940k" wrote:
В связи с этим впечатлением, у меня с трудом язык поворачивается назвать то, что я увидел в доках ORM

Тут с вами согласен. Это еще не доктрина далеко, где вообще не паришься с сущностями и связями и все наглядно хранится в одном месте. Но это отличный переход для Drupal. Согласитесь, ведь не нужно было полгода ковырять API, чтобы перепрыгнуть на 7-ю ветку, разработчики отлично продумали стадии перехода от версии к версии. И требовать сейчас от новой версии друпал традиционного MVC и ORM ИМХО наглость))

Аватар пользователя xom940k xom940k 12 февраля 2012 в 0:53

"xxandeadxx" wrote:
покажи, где ты увидел в доках orm?

че нервничать то? Объясни что я не понимаю и я соглашусь, если все будет логично )
Я конечно могу скинуть ссыль на вики, определяющую абривиатуру...
"boneg" wrote:
И требовать сейчас от новой версии друпал традиционного MVC и ORM ИМХО наглость))

да ни в коем случае. Ни от кого я ниче не требую. Более того, я считаю что друпал для опредленного круга задач годен и по моему мнению нужно наоборот стремится к обратной совместимости, нежели делать из друпала чтото непонятно ) Проще тогда уж написать новый фреймворк, хотя зачем? Есть же симфония под пхп )
Я вообще об впечатлениях. Я боюсь залипать за то что они там нагородили, поэтому спросил прежде о впечатлениях. Вдруг вы меня удивите )))

Аватар пользователя xxandeadxx xxandeadxx 12 февраля 2012 в 1:06

"xom940k" wrote:
че нервничать то?

где я нервничал то? я задал вполне уместный вопрос

"xom940k" wrote:
Я конечно могу скинуть ссыль на вики

скинь лучше ссыль на доки друпала, где говорится про orm, или где "ты подумал" что говорится про orm

"xom940k" wrote:
ок ок, она выглядит как будто orm =D

кто "она"?