2014-12-28 3 views
5

Вам нужно закрыть инструкции mysqli?

Задача


Я пытаюсь подсчитать, есть ли регистрация с тем же номером телефона и датой. Это делается для того, чтобы люди не регистрировали две оговорки в одну и ту же дату (время). Моя проблема в том, что я ожидаю, что запрос вернет 0, потому что в базе данных нет регистрации с теми же данными. Однако результатом является 1. Это означало бы, что в базе данных уже есть что-то такое, но нет. Я предполагаю, что он связан с запросом, который я выполняю перед текущим запросом. Мне интересно, стоит ли мне закрывать заявление.

Что есть я пытался


Я попытался закрыть заявление $stmt->close(), но безрезультатно. Я попытался создать новые переменные вместо повторного использования тех из предыдущего запроса, но это тоже не сработало. Я triple проверил базу данных, чтобы убедиться, что там нет регистрации с теми же деталями, и я на 100% уверен, что в базе данных нет ничего плохого.

Код


Вот мой код. Я думаю, что проблема лежит в первой части запроса.

$query = "SELECT count(*) as reservation_amount FROM reservation WHERE `date`= ?"; 
$stmt = $db->prepare($query); 
$stmt->bind_param("s", $datetime); 
$stmt->execute(); 
$stmt->bind_result($count); 
while($row = $stmt->fetch()){ 
    $res_count = $row; //res_count is 1 in this case. I'm thinking I need to close something here? 
} 

$query = "SELECT count(*) as registered FROM reservation WHERE `number` = ? and `date`= ?"; 
$stmt = $db->prepare($query); 
$stmt->bind_param("is", $number, $datetime); 
$stmt->execute(); 
$stmt->bind_result($count); 
while($row = $stmt->fetch()){ 
    $registered = $row; //outputs 1 but I'm expecting 0 
} 

Входной


datetime = 2014-12-28 17:00:00 
number = 0612345678 

Database


База данных содержит следующую запись:

id name surname number email   date    amount 
5 Henk Houtman 9060666 [email protected] 2014-12-28 17:00:00 1 

ошибки


Нет ошибок.

+0

'number = 0612345678'' '' int' будет преобразован в какое-либо другое десятичное значение –

+4

'$ statement-> fetch()' возвращает boolean true, оценивая значение 1. Вероятно, вы хотите 'store_result()' и 'bind_result()'. http://php.net/manual/en/mysqli-stmt.bind-result.php –

ответ

2

mysqli_stmt_fetch вернет true на успех. В случае успеха ваш запрос всегда будет возвращать одну и только одну строку (потому что вы запрашиваете COUNT, причем одна строка содержит требуемое значение).

while($row = $stmt->fetch()){ 
    $registered = $count; 
} 

Вы должны использовать связанную переменную $count при определении величины в возвращенной строке. (Примечание: вам не нужна переменная $row.)

+0

Да, именно так. Работа в первый раз с mysqli привела меня к использованию неправильного кода, который я нашел где-то, я думаю. Должен был придерживаться PDO;) Приветствия. – Bono

+0

Поскольку это приведет только к возврату не более одной строки, было бы лучше заменить 'while' на' if'. – halfer

+0

@halfer Я согласен. (Как правило, я стараюсь изменить как можно меньше кода. 'While' также более« условно »в большинстве случаев использования« mysqli_stmt_fetch ».) –

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