#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)
, поэтому измените ее также.