2012-03-28 6 views
-1

Обычно я стараюсь минимизировать вызовы MySQL, но, возможно, я столкнулся с тем случаем, когда мне приходится выполнять несколько вызовов MySQL в одном скрипте.Использование mysql_fetch_assoc дважды в одном скрипте PHP

Похоже, вы не можете использовать mysql_fetch_assoc дважды в одном скрипте (!).

Похоже, что mysql_data_seek - это решение, но я не могу заставить его работать.

Чтобы быть ясным, у меня есть два вопроса, которые мне нужно сделать. Второй запрос зависит от результатов первого ... Вот структура:

 
$result = mysql_query($query1); 

while($row = mysql_fetch_assoc($result)){ 
$pos = $row['position']; 
} 

mysql_free_result($result); // result freed per comment below. 

$query2 = ' '; //... dependent on $pos - in mysql shell this returns results! 
$result2 = mysql_query($query2) 

while($row = mysql_fetch_assoc($result2)){ 

echo $row['id']; 

} 

Что происходит выше, что второе, а возвращает цикл никаких результатов, даже если запрос не должны иметь нетривиальные строки.


Просто, чтобы быть уверенным: ли это, как вы очистить указатель от предыдущего результата, чтобы иметь возможность использовать mysql_fetch_assoc снова?

mysql_data_seek($result,mysql_num_rows($result) - 1);

Я не уверен, что использовать в качестве второго аргумента. Правда, я не то, что ясно на указатели, но мне кажется, я должен очистить указатель на 0. Но я получаю эту ошибку:

Offset 0 is invalid for MySQL result index 8 (or the query data is unbuffered

+0

http://lt.php.net/mysql_data_seek –

+1

http://stackoverflow.com/questions/5749711/why-you-should-not-use-mysql-fetch-assoc-more-than-1-time –

+0

Вы можете вызывать его столько раз, сколько хотите, но вы получите результаты только в том случае, если вы передаете действительный дескриптор результата, и этот результат по-прежнему имеет свободные строки. –

ответ

0

ОП изменил вопрос, поэтому увидеть правку

* Удаленные отправленные коды здесь **

EDIT

После того как вы отредактировали свой вопрос и выяснили, что у вас есть на самом деле 2 ресурса, похоже, что что-то не так. Вам не нужно беспокоиться о указателе, когда вы используете два разных ресурса для доставки mysql_fetch_assoc(). Вещь с mysql_fetch_assoc() заключается в том, что она принимает ваш параметр ($result) по ссылке.

Теперь, чтобы ответить на ваш вопрос:

I usually try to minimize calls to MySQL where possible, but I've finally encountered the case where I have to do multiple calls to MySQL in a single script.

Ничего плохого с несколькими вызовами SQL в одном сценарии. Хотя в целом вы должны попытаться минимизировать вызовы SQL (потому что они могут повредить производительность).

It looks like you can't use mysql_fetch_assoc twice in a single script(!).

Plain wrong. Ofc вы можете это сделать. До тех пор, пока вы заметите выше. Однако, когда у вас есть два набора результатов, это не будет вашей проблемой.

It seems that mysql_data_seek is the solution, but I cannot seem to get it to work.

Снова: это не имеет никакого отношения к нему, когда вы используете два (разных) набора результатов.

To be clear, I have two queries I need to make. The second query depends on results from the first.

Это не должно быть проблемой. Похоже, что-то еще не так. Вы подтвердили, что второй запрос действительно так, как вы думаете? Вы уверены, что есть записи?Вы уверены, что ошибок (MySQL) нет. У вас есть сообщение об ошибках? Вы пробовали распечатать mysql_error()? Чтобы лучше быть в состоянии помочь вам, можете ли вы предоставить свой реальный код, а не etc etc? Может, что-то еще происходит.

Или, может быть, вы просто пытаетесь запустить второй запрос в первом цикле. Который был бы плохим во многих отношениях.

+0

Что делать, если у вас есть второй запрос, который вам нужен для mysql_fetch_assoc для одного и того же скрипта? – ina

+0

Извините, что взял на себя ваш ответ , но @ina изменил вопрос, так что это было неправильно (больше). Надеюсь, вы не против. :-) – PeeHaa

+0

Второй запрос действительно возвращает записи! второй запрос выполняется внутри его собственного цикла. извините, я часами смотрел на эту штуку, и это сводит меня с ума! – ina

1

Проверьте свою связь с mysql_error() и проверьте, не получается ли вы получить сообщение «команды из синхронизации». Если это так, вам нужно вызвать mysql_free_result() после завершения первого запроса и до начала второго. Вы также можете просто вызвать mysql_close(), чтобы закрыть соединение с базой данных, а затем снова открыть новую.

Для получения дополнительной информации см. this question.

Смежные вопросы