mysqli_stmt_store_result(): Аргумент #1 (оператор$) должен иметь тип mysqli_stmt, bool

#php #mysqli

Вопрос:

Полная Ошибка:

 Fatal error: Uncaught TypeError: mysqli_stmt_store_result(): Argument #1 ($statement) must be of type mysqli_stmt, bool given in C:xampphtdocsTableClasses.php:986 Stack trace: #0 C:xampphtdocsTableClasses.php(986): mysqli_stmt_store_result(true) #1 C:xampphtdocsHospAdmin_createStaffValidation.php(62): TableClasses-gt;createDoctor('test', 'test', 'G32434243G', 'Male', '2021-11-09', '234234224', 'test', 'ykk@gmail.com', 'Anaesthesiology', 'X-ray', '8989', '1_5yr') #2 {main} thrown in C:xampphtdocsTableClasses.php on line 986  

Я получил эту ошибку, не знаю, что с ней не так

Мой код

 $allaccounts = mysqli_prepare($this-gt;conn, "SELECT 'patient' as Role, FirstName, LastName, NRIC, password FROM patients WHERE NRIC = ?   UNION ALL   SELECT 'doctor', FirstName, LastName, NRIC, password FROM doctor WHERE NRIC = ?   UNION ALL   SELECT 'nurse', FirstName, LastName, NRIC, password FROM nurse WHERE NRIC = ?   UNION ALL   SELECT 'admin', FirstName, LastName, NRIC, password FROM administrator WHERE NRIC = ?   UNION ALL   SELECT 'HospitalAdmin', FirstName, LastName, NRIC, password FROM hospitaladmin WHERE NRIC = ? ");   mysqli_stmt_bind_param($allaccounts, "sssss", $NRIC, $NRIC, $NRIC, $NRIC, $NRIC);  $AllAccstmt = mysqli_stmt_execute($allaccounts);  mysqli_stmt_store_result($AllAccstmt);  mysqli_stmt_close($allaccounts);    $allaccounts_Email = mysqli_prepare($this-gt;conn, "SELECT 'patient' as Role, FirstName, LastName, NRIC, password FROM patients WHERE Email = ?   UNION ALL   SELECT 'doctor', FirstName, LastName, NRIC, password FROM doctor WHERE email = ?   UNION ALL   SELECT 'nurse', FirstName, LastName, NRIC, password FROM nurse WHERE email = ?   UNION ALL   SELECT 'admin', FirstName, LastName, NRIC, password FROM administrator WHERE email = ?   UNION ALL   SELECT 'HospitalAdmin', FirstName, LastName, NRIC, password FROM hospitaladmin WHERE email = ? ");   mysqli_stmt_bind_param($allaccounts_Email, "sssss", $Email, $Email, $Email, $Email, $Email);  $AllAcc_Email_stmt = mysqli_stmt_execute($allaccounts_Email);  mysqli_stmt_store_result($AllAcc_Email_stmt);  mysqli_stmt_close($allaccounts_Email);     if (mysqli_stmt_num_rows($AllAccstmt) != 0 OR mysqli_stmt_num_rows($AllAcc_Email_stmt) != 0){  

Я пытаюсь проверить, пуста ли инструкция select. Но это продолжает давать мне ошибку.

Комментарии:

1. Кстати, ваша структура базы данных сумасшедшая. Вам не нужны отдельные таблицы для каждого типа людей в вашей системе!! Представьте, что если вы продолжите добавлять роли, то количество таблиц станет очень большим, и вам по-прежнему придется изменять свой код, чтобы включить их. Просто присядьте за один users столик. У вас может быть role столбец в этой таблице для хранения того, является ли кто-то врачом, медсестрой, администратором и т. Д. Это значительно упростит обслуживание вашей системы и облегчит написание запросов. И, пожалуйста, ознакомьтесь с темой нормализации базы данных, прежде чем совершать еще какие-либо подобные ошибки.

Ответ №1:

Как говорится в сообщении об ошибке, mysqli_stmt_store_result() ожидает mysqli_stmt в качестве аргумента. Вы указали логическое значение.

Измените код следующим образом:

 mysqli_stmt_bind_param($allaccounts, "sssss", $NRIC, $NRIC, $NRIC, $NRIC, $NRIC); mysqli_stmt_execute($allaccounts); mysqli_stmt_store_result($allaccounts);  

Примечание: нет смысла сразу закрывать подготовленное заявление, ничего не делая с данными. Снимите close .

Возвращаемое значение execute() всегда является логическим. Вам не нужно это значение в вашем коде. Вы получите ту же ошибку для mysqli_stmt_num_rows($AllAccstmt) , поэтому измените ее также.