[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как красиво за'bind'индить перменные.
Joker
Прочитав доку по mySQLi увидел для себя приятный сюрприз это связывание переменный в запросе, знал что такое есть (в оракле такое аквно использую) но где и как под мускул не не знал.

Из доки:
Свернутый текст
$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 smile.gif

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

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

Спустя 3 минуты, 27 секунд (19.05.2011 - 21:06) sharki написал(а):
Помнится мне, что такая конструкция
INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)

Очень хорошо оптимизируют большие запросы. Т.к mysql не надо думать о том, куда в следующем запросе ему положить то или иное значение, т.е у него есть задача положить ВОТ это значение в ЭТО поле, и не надо лишний раз думать.

Думаю в маленьких проектах это несущественно

Спустя 2 минуты, 28 секунд (19.05.2011 - 21:08) inpost написал(а):
sharki
А как потом читать? Ты видел ту тему с Николаем? Особенно когда запрос на 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, классная либа, когда-то ты мне сильно облегчила жизнь!

$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-ой и в основном это динамически создаваемые. Так что, проект-проекту рознь.

Спустя 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 иньекций
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.