Из доки:
Свернутый текст
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);
/* close statement and connection */
$stmt->close();
/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", $mysqli->affected_rows);
/* close connection */
$mysqli->close();
Как показано в примере биндить перменные можно через "?" (знак вопроса) но в оракле всё поинтереснее там можно так:
$stmp = $oracle->prepare('select * from table where id = :user_id');
$stmp->bind(':user_id',1,'s');
И это намного уодбнее т.к.
1. Визаульно сразу понятно что за перменная смотря только на запрос.
2. Одну и туже переменную можно юзать несколько раз. (для знаков вопроса придеться биндить несколько раз одно и тоже)
Соответственно у меня вопрос есть ли способ сделать тоже самое под мускулом? оч хочется)
з.ы. В гугл желательно не посылать уже 2 часа там сидел ненашел :(
Спустя 4 минуты, 49 секунд (19.05.2011 - 20:44) Семён написал(а):
Не поверишь это называется placeholders

Спустя 5 минут, 47 секунд (19.05.2011 - 20:50) Joker написал(а):
пасиб, сразу нашел что MySQLi не поддерживает именнованые метки

Спустя 12 минут, 37 секунд (19.05.2011 - 21:02) inpost написал(а):
Joker
Недели 2 назад Николай говорил, на сколько он плохо относится к плейсхолдерам
Недели 2 назад Николай говорил, на сколько он плохо относится к плейсхолдерам

Спустя 3 минуты, 27 секунд (19.05.2011 - 21:06) sharki написал(а):
Помнится мне, что такая конструкция
Очень хорошо оптимизируют большие запросы. Т.к mysql не надо думать о том, куда в следующем запросе ему положить то или иное значение, т.е у него есть задача положить ВОТ это значение в ЭТО поле, и не надо лишний раз думать.
Думаю в маленьких проектах это несущественно
INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)
Очень хорошо оптимизируют большие запросы. Т.к mysql не надо думать о том, куда в следующем запросе ему положить то или иное значение, т.е у него есть задача положить ВОТ это значение в ЭТО поле, и не надо лишний раз думать.
Думаю в маленьких проектах это несущественно
Спустя 2 минуты, 28 секунд (19.05.2011 - 21:08) inpost написал(а):
sharki
А как потом читать? Ты видел ту тему с Николаем? Особенно когда запрос на 30-40 строк, и вместо данных, везде ? ? ? ?
А как потом читать? Ты видел ту тему с Николаем? Особенно когда запрос на 30-40 строк, и вместо данных, везде ? ? ? ?
Спустя 5 минут, 20 секунд (19.05.2011 - 21:14) alex12060 написал(а):
Как наша учитель по русскому говорила:
- Чья тетрадь?? Догадайся по хвосту?!
- Чья тетрадь?? Догадайся по хвосту?!
Спустя 4 минуты, 20 секунд (19.05.2011 - 21:18) sharki написал(а):
inpost
ну это уже минусы таких методов...думаю можно обойтись лишними комментариями в виде запроса, чтобы было нагляднее
ну это уже минусы таких методов...думаю можно обойтись лишними комментариями в виде запроса, чтобы было нагляднее
Спустя 9 минут, 7 секунд (19.05.2011 - 21:27) Семён написал(а):
Цитата (inpost @ 19.05.2011 - 22:08) |
sharki А как потом читать? Ты видел ту тему с Николаем? Особенно когда запрос на 30-40 строк, и вместо данных, везде ? ? ? ? |
Пример запроса в студию пусть в доказательство приведёт )
Такая каша будет только при INSERT-ax или UPDAT-ax, но в любом более менее серьёзном фреймворке, это решается путём передачи всего 1 массива key=>value ) и вспомогательного (при UPDATE, если требуется)
Спустя 33 минуты, 58 секунд (19.05.2011 - 22:01) Gradus написал(а):
работал я как-то с cms, правдо там была самописная функция и это был ужас.Всё равно что с printf сидеть высчитывать.
Спустя 9 минут, 26 секунд (19.05.2011 - 22:10) Семён написал(а):
Сравнение (из доков Котерова), эх старая добрая DBSimple, классная либа, когда-то ты мне сильно облегчила жизнь!
А вот то о чём говорил выше:
Простые условия в placeholder-s
$DB->select('SELECT * FROM ?_users');
// SELECT * FROM phpbb_users
// Сравните:
$DB->select('SELECT * FROM '.TABLE_PREFIX.'_users');
$DB->select('SELECT ?# FROM tbl', 'date');
// MySQL: SELECT `date` FROM tbl
// FireBird: SELECT "date" FROM tbl
$DB->select('SELECT ID AS ?# FROM tbl', 'this is ID');
// MySQL: SELECT ID AS `this is ID` FROM tbl
// FireBird: SELECT ID AS "this is ID" FROM tbl
А вот то о чём говорил выше:
$row = array('id' => 101, 'name' => 'Rabbit', 'age' => 30);
$DB->query('INSERT INTO table(?#) VALUES(?a)', array_keys($row), array_values($row));
Простые условия в placeholder-s
$DB->query(
'INSERT INTO forest(PARENT_ID, NAME) VALUES(?, ?)',
($_GET['parent']? $_GET['parent'] : null), $name
);
Спустя 20 минут, 15 секунд (19.05.2011 - 22:31) inpost написал(а):
Семён
Что не говори, но мне неудобно так читать =(
Что не говори, но мне неудобно так читать =(
Спустя 10 часов, 12 минут, 21 секунда (20.05.2011 - 08:43) linker написал(а):
Мне тоже не удобно, это писец. Такие короткие запросы тока в хоумпагах, запрос строк на 15 и более уже будет абсолютно не читабельным. А сидеть и подсчитывать знаки вопроса... я промолчу.
Спустя 1 час, 17 минут, 49 секунд (20.05.2011 - 10:01) vasa_c написал(а):
Цитата |
Такие короткие запросы тока в хоумпагах, запрос строк на 15 и более уже будет абсолютно не читабельным. |
Я работал в проектах, расчитанных на миллионы посетителей. Там не было ни одного SQL-запрос длинее одной строчки.
Спустя 4 минуты, 59 секунд (20.05.2011 - 10:06) vasa_c написал(а):
Цитата |
Очень хорошо оптимизируют большие запросы. Т.к mysql не надо думать о том, куда в следующем запросе ему положить то или иное значение, т.е у него есть задача положить ВОТ это значение в ЭТО поле, и не надо лишний раз думать. |
Что, простите?
Спустя 1 минута, 54 секунды (20.05.2011 - 10:08) vasa_c написал(а):
Цитата |
А как потом читать? Ты видел ту тему с Николаем? Особенно когда запрос на 30-40 строк, и вместо данных, везде ? ? ? ? |
Кто такой Николай и почему его поминают с таким придыханием? Запрос на 30-40 строк обычно вообще читать невозможно.
Если вместо "?" будет что-то вроде '.mysql_real_escape_string($data['row']).' так будет лучше?
Спустя 3 минуты, 32 секунды (20.05.2011 - 10:11) linker написал(а):
vasa_c
Я работаю, хоть и не с такой большой аудиторией, но сложность проектов у меня обязывает рисовать запросы более 1-ой и в основном это динамически создаваемые. Так что, проект-проекту рознь.
Я работаю, хоть и не с такой большой аудиторией, но сложность проектов у меня обязывает рисовать запросы более 1-ой и в основном это динамически создаваемые. Так что, проект-проекту рознь.
Спустя 10 минут, 24 секунды (20.05.2011 - 10:22) ИНСИ написал(а):
Цитата |
Я работал в проектах, расчитанных на миллионы посетителей. Там не было ни одного SQL-запрос длинее одной строчки. |
Дай ссылку плиз на этот проект
Спустя 6 минут, 21 секунда (20.05.2011 - 10:28) vasa_c написал(а):
Цитата |
Я работаю, хоть и не с такой большой аудиторией, но сложность проектов у меня обязывает рисовать запросы более 1-ой и в основном это динамически создаваемые. |
В чём выражается сложность?
Спустя 45 секунд (20.05.2011 - 10:29) vasa_c написал(а):
Цитата |
Дай ссылку плиз на этот проект |
Из последнего, к сожалению, ссылку разгласить могу только на неудачный: http://tellver.com/welcome/
Спустя 6 минут, 26 секунд (20.05.2011 - 10:35) kirik написал(а):
Цитата (velbox @ 20.05.2011 - 03:22) |
Дай ссылку плиз на этот проект |
Да что там ссылка.. могу лишь подтвердить что большие запросы имеют место быть в специфичных проектах. Всевозможные соцсети, блоги, ютубы вполне пишутся короткими запросами. Тем более что при возрастающей нагрузке полюбому приходится убирать джоины..
Единственное неудобство знаковых плэйсхолдеров вылазит на инсёртах и апдейтах, как уже сказал Семён.
Спустя 1 час, 54 минуты, 48 секунд (20.05.2011 - 12:30) linker написал(а):
vasa_c
Сложность в возложенных задачах на приложение. Не хочу повторяться, но электронный документооборот, а точнее Электронный Издательский Комплекс для производства газет в режиме "Ежедневка".
Сложность в возложенных задачах на приложение. Не хочу повторяться, но электронный документооборот, а точнее Электронный Издательский Комплекс для производства газет в режиме "Ежедневка".
Спустя 31 минута, 43 секунды (20.05.2011 - 13:02) vasa_c написал(а):
Цитата |
Сложность в возложенных задачах на приложение. Не хочу повторяться, но электронный документооборот, а точнее Электронный Издательский Комплекс для производства газет в режиме "Ежедневка". |
Возможно, здесь и нужно.
А в тех задачах, которые подразумеваются в этой теме - нет.
Хочешь иногда подправить богомерзкий SMF или phpBB, и находишь там запрос на два экрана. Кто его составлял, видать, свою крутизну в SQL решил показать.
Спустя 3 минуты, 24 секунды (20.05.2011 - 13:05) linker написал(а):
Не всегда один большой запрос работает быстрее кучи мелких, это справедливо и наоборот. Выяснить как лучше и быстрее, можно исключительно после тестов на производительность, а до этого говорить о чём-то не имеет смысла.
Спустя 31 минута, 56 секунд (20.05.2011 - 13:37) vasa_c написал(а):
linker, кроме мифической быстроты выполнения запроса за которую все держатся (при этом зачастую ошибаясь даже здесь в выборе того что быстрее), существует ещё множество немаловажных критериев.
Спустя 10 минут, 44 секунды (20.05.2011 - 13:48) Семён написал(а):
Вот не нужно только холливаров )))
Спустя 2 месяца, 5 часов, 37 минут, 3 секунды (20.07.2011 - 19:25) Joker написал(а):
Цитата (inpost @ 20.05.2011 - 00:31) |
Семён Что не говори, но мне неудобно так читать =( |
офф топ но всё же когда работал с ораклом писал вот так было очень круто:
$sql = "SELECT * FROM table WHERE `user_id` = :user_id";
$r = $db->parse($sql);
$r->bind('s','user_id',1);
$r->execute();
И тут как минимум 2 сильнейших плюса:
1. Это кеширование запросов на уровне БД
2. полное исключение sql иньекций