Два и более запроса, за один вызов mysql_query() как?

  • Автор темы Digitalator
  • Дата начала

Digitalator

Guest
Два и более запроса, за один вызов mysql_query() как?

собственно subj.

Попытка выполнить запрос типа
[sql]
SELECT * FROM table1 WHERE 1 ORDER BY col1 LIMIT 1,25; UPDATE table2 SET col2=2 WHERE col1=1;[/sql]
приводит к ошибке
mySQL error: You have an error in your SQL syntax near '; UPDATE table2 SET col2=2 where col1=1 ' at line 5
mySQL error code: 1064
Тот же самый запрос спокойно выполняется в phpmyadmin. Если выполнять поочереди, то все работает, но необходимо чтоб запросы выполнялись в одном вызове mysql_query, а не в нескольких подряд идущих.
Подскажите как поступить, чтоб все работало
 

Кром

Новичок
>но необходимо чтоб запросы выполнялись в одном вызове mysql_query

Это не необходимо. Можно прекрасно без этого обойтись.
 

Макс

Старожил PHPClub
phpmyadmin разбивает твой запрос на отдльные запросы и по очереди выполняет их через mysql_query

PS
поиск по слову gandon поможет. Я серьезно :)
 

Digitalator

Guest
поиск по слову gandon поможет. Я серьезно :)
Нет, там не то что мне нужно - не должно быть доп. скриптов.
Хорошо, тогда другой вопрос - возможно ли вообще выполянть 2 и более запроса в mysql_querry() ?


Это не необходимо. Можно прекрасно без этого обойтись
Кром, я уважаю твои знания и опыт, но в данном случае я не могу вызвать mysql_query() более одного раза.
 

Frol

Новичок
Хорошо, тогда другой вопрос - возможно ли вообще выполянть 2 и более запроса в mysql_querry() ?
[m]mysql_query[/m]
Кром, я уважаю твои знания и опыт, но в данном случае я не могу вызвать mysql_query() более одного раза.
интересно услышать о таком случае
 

tony2001

TeaM PHPClub
>Хорошо, тогда другой вопрос - возможно ли вообще выполянть 2 и более запроса в mysql_querry() ?
нет

>в данном случае я не могу вызвать mysql_query() более одного раза.
значит, твоя задача невыполнима.
 

chira

Новичок
Digitalator
если вдруг предположить что сможет,
как ты думаешь, что тебе должен вернуть mysql_query() после выполнения двух запросов?
 

Cid

...двинутый новичок
Вообще, строго говоря, ни одна СУБД не "выполняет" несколько запросов в рамках одного пакета.

Дело в том, что обработка одного запроса это довольно сложная процедура. Ведь жизненный цикл одного запроса подразумевает разбор, оптимизацию (возможно, в несколько проходов), анализ и построение плана выполнения (plan analyzer) и только потом поиск и операции с данными.

Соответственно, если бы существовала возможность выполнения почти неограниченного числа последовательных запросов как одного - то как должен быть реализован analyzer и оптимизатор ? Для подобных вещей, в частности, придумали механизм транзакций. В MySQL (3.x) все транзакции - на атомарном уровне, т.е. на уровне одной записи. Т.е. если ты выполняешь подряд 25 запросов типа INSERT, это 25 атомарных транзакций.
 

Cougar

Кошак
tony2001 Массив, в каждом элементе которого находится результат выполнения отдельного запроса из "пакета". Тогда, разумеется, и mysql_error() должен будет возвращать массив :) Хотя это обсуждение уже на грани демагогии :)
 

Digitalator

Guest
да, SQL-inject ни больше ни меньше.
Тем не менее вот из официальной спецификации PHP:
Код:
$offset = argv[0]; // проверка пользовательских данных отсутствует
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// используя PostgreSQL 
$result = pg_exec($conn, $query);
// используя MySQL
$result = mysql_query($query);
Обычно пользователи кликают по ссылкам 'вперед' и 'назад', вследствии чего значение переменной $offset заносится в адресную строку. Скрипт ожидает, что $offset - десятиричное число. Однако, взломщик может попытаться взломать систему, присоединив к строке запроса дополнительную подстроку, обработанную функцией urlencode():

Код:
// используя PostgreSQL 
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--

// используя MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES
Тут как видно выполняются ажно 3 запроса в mysql_query. Вопрос в том, что тут понимается под
обработанную функцией urlencode():
Естественно результат в данном случае неважен.

Мне просто интересно возможно ли вообще
выполнить любой запрос к базе данных
securitylab.ru
Одними юнионами сыты не будем :D
 

Кром

Новичок
>Тут как видно выполняются ажно 3 запроса в mysql_query.

Через mysql_query это не прокатит. Это гон.
Кстати, помню еще год назад кто-то поднимал похожую тему и именно из за этой статьи в мане. Хорошая утка. :)
 

Digitalator

Guest
Стало быть все эти статьи о SQL-инъекции, в которых написано что с ее помощью можно делать с сайтом что угодно это гон?

Мне вот например не удалось выполнить "любой запрос" на форуме IPB (установленом локально на моем компе на денвере) с помощью ошибки в search.php, где не проверяется параметр st, о которой так много было шуму. Более того не удалось выполнить даже union select т.к. order by должен быть в конце запроса, а там он выходит посередине.

И можно много приводить примеров когда подобные "дырки" не могут быть использованы..
 

tony2001

TeaM PHPClub
авторитет securitylab очень давно упал в моих глазах.
дело в том, что ребята, конечно, выполняют нужную работу, но не осознавая ответственности, которая за ней стоит.
тупое копирование секьюрити адвизори даже с очень известных сайтов (а они это и делают) может привести к большим конфузам, т.к. даже очень известные сайты (сюрприз!) иногда пропускают откровенные глупости.
 
Сверху