Если я делаю это в PHP, он работает нормально и петли, как ожидалось:
$rs = mysql_query($sql); while ($row = mysql_fetch_assoc($rs)){ writeme("UserID: " . $row["UserID"]); }
Но я все время хочу отвлечь это на функцию, которую я назвал ExecuteQuery:
function ExecuteQuery($sql){ $result = mysql_query($sql); if ($result) { if($result != 1){ return mysql_fetch_assoc($result); // return recordset } }else{ $message = 'Invalid query: ' . mysql_error() . "<br>"; $message .= 'Whole query: ' . $sql; echo $message; die(); }
}
Эта функция отлично работает в 2 из 3 сценариев:
1- Отлично подходит для запроса, который возвращает 1 строку, и я могу получить доступ к этому:
$ rs = ExecuteQuery ($ sql);
$ foo = $ rs ["UserID"];
2- Отлично работает для оператора sql, который не возвращает никаких записей, например UPDATE или DELETE.
3- Но когда я пытаюсь вернуть набор записей, который возвращает несколько записей, а затем прокручивать его, я получаю бесконечный цикл, и мой браузер падает. Как это:
$rs = ExecuteQuery($sql); while ($row = $rs){ writeme("UserID: " . $row["UserID"]); }
Как я могу изменить цикл while, чтобы он продвигался к каждой новой записи в наборе записей и останавливался после последней записи? Я уверен, что это глупая мелочь, но я пока еще не специалист по PHP. Мне бы очень хотелось, чтобы моя функция ExecuteQuery могла обрабатывать все 3 сценария, это очень удобно.
mysql_fetch_assoc () возвращает только одну строку результата. Чтобы получить следующую строку, вам нужно снова вызвать mysql_fetch_assoc (). Единственное, что вы могли бы сделать, это вернуть функцию ExecuteQuery массив массивов:
$rows = array(); while ($row = mysql_fetch_assoc($result) !== false) { $rows[] = $row; } return $rows;
Кроме того, вы не должны использовать функции mysql_ *, поскольку они устарели. Вместо этого попробуйте использовать PDO или mysqli_ *.
попробуйте foreach($rs as $row){
вместо while ($row = $rs){
Не используйте пока, используйте foreach:
$rs = ExecuteQuery($sql); foreach ($rs as $row){ writeme("UserID: " . $row["UserID"]); }