Итак, у меня есть одна функция на PHP с двумя sql-запросами, проблема в том, что вторая не работает, и я не знаю почему.
<?php
include('../dbFunctions.php');
function getName($id) {
$connection = connectDB();
$sql = mysqli_prepare($connection, "SELECT * FROM lugar_concreto WHERE idLugar = ?");
mysqli_stmt_bind_param($sql, "s", $id);
$query = $sql->execute();
if (!$query)
die();
$result = $sql->store_result();
$realresult = $sql->bind_result($id, $param1, $param2, $param3);
$sql->fetch();
if ($sql->num_rows() == 0) {
$sql2 = mysqli_prepare($connection, "SELECT * FROM lugar_transporte WHERE idLugarTte = ?");
mysqli_stmt_bind_param($sql2, "s", $id);
$query2 = $sql2->execute();
if (!$query2)
die();
$result2 = $sql2->store_result();
$realresult2 = $sql2->bind_result($id, $param1, $param2, $param3);
$sql2->fetch();
$rawdata = array();
$correct = $query2;
$rawdata['param1'] = utf8_encode($param1);
if (utf8_encode($param2) != null)
$rawdata['param2'] = utf8_encode($param2);
$rawdata['param3'] = utf8_encode($param3);
$rawdata['correct'] = $correct;
} else {
$rawdata = array();
$correct = $query;
$rawdata['param1'] = utf8_encode($param1);
$rawdata['param2'] = utf8_encode($param2);
$rawdata['param3'] = utf8_encode($param3);
$rawdata['correct'] = $correct;
}
disconnectDB($connection);
return $rawdata;
}
?>
Я подготавливаю и выполняю один запрос, и если он возвращает пустой результат (0 строк), я выполняю другой запрос, я знаю, что теперь это ясный и эффективный способ, но я думаю, он должен работать.
Проблема в том, что я использовал var_dump()
с переменными внутри большого if, как $query
, $result
, $realresult
и все они возвращали bool(true)
, но после $sql->fetch();
переменная $sql
имеет 0 num_rows, я не знаю почему.
Я использую php 5, я не знаю, связано ли это с этим.
Если кто-то из вас знает, как это сделать лучше, скажите мне, любая помощь будет оценена!
Обновлено: так выглядит var $sql2
с var_dump()
:
Отчасти личные предпочтения, отчасти даже полезные, я предлагаю явно перечислить поля, которые вы выбираете. Он не только проясняет ваш код для будущих читателей, но и гарантирует, что в случае добавления полей в будущем вы получите ожидаемое количество возвращаемых столбцов.
Ваш заголовок не соответствует задаче. Ваша проблема связана с num_rows
из первого запроса, а не из второго.
Нет, первый запрос работает нормально, и num_rows
тоже, проблема во втором запросе, в котором 0 столбцов, я видел это с var_dump($sql)
внутри if
@DavidZam num_rows()
- это функция нет. Вы можете проверить это, передав идентификатор, который должен создать строку из первого запроса. Вы обнаружите, что по-прежнему попадает внутрь if
, даже если там нет 0 строк.
@PatrickQ, вы правы, я удалил (), но второй запрос все еще вернул 0 столбцов, я не знаю почему
Я предлагаю вам не использовать повторно имена переменных, как вы. Я не уверен, как библиотека mysqli обрабатывает bind_result()
, когда не возвращаются строки, но я бы сказал, что есть хороший шанс, что для $id
установлено какое-то ложное значение (FALSE, NULL, '' и т. д.). Таким образом, вместо того, чтобы быть значением, переданным в функцию (что, вероятно, вы ожидаете), оно вполне может быть уничтожено.
Я изменил имя переменных для bind_result()
и все еще не работает ... Я добавил изображение с содержимым переменной $sql2
, поэтому я знаю, что у него 0 строк.
Я говорю о том, что вы делаете $realresult = $sql->bind_result($id, $param1, $param2, $param3);
, а затем mysqli_stmt_bind_param($sql2, "s", $id);
. Если вы изменили любой из них, пожалуйста, обновите свой код выше, чтобы отразить это.
ЭТО БЫЛА ПРОБЛЕМА! Я ЛЮБЛЮ ТЕБЯ ЧУВАК! @PatrickQ, большое спасибо! Я исправил сохранение $id
во временной переменной и использование его во втором методе mysqli_stmt_bind_param()
, спасибо !!
Примечание. Объектно-ориентированный интерфейс
mysqli
значительно менее подробен, что упрощает чтение и аудит кода, и его нелегко спутать с устаревшим интерфейсомmysql_query
. Прежде чем вы слишком увлечетесь процедурным стилем, стоит переключиться на него. Пример:$db = new mysqli(…)
и$db->prepare("…")
. Процедурный интерфейс является артефактом эпохи PHP 4, когда был представлен APImysqli
, и его не следует использовать в новом коде.