PHP / mysqli: подготовленные операторы с num_rows постоянно ничего не возвращают

В моем тестовом окружении есть база данных, содержащая некоторую личную информацию (имя, адрес электронной почты, адрес и т. Д.). Эта информация может быть вставлена ​​кем-либо в базу данных через форму. На заднем плане они вставляются с параметризованным INSERT в базу данных после подачи.
Теперь я хотел бы обнаружить, пытается ли какой-либо человек снова вставить те же значения в базу данных, и если он это делает, не вставлять новые значения и вместо этого показывать сообщение об ошибке. (Таким образом, каждое имя человека в базе данных уникально, нет нескольких строк, связанных с одним именем).
У меня было множество идей о том, как этого добиться. Моим первым было использовать запрос вроде REPLACE или же INSERT IGNORE, но этот метод не даст мне обратную связь, чтобы я мог отобразить сообщение об ошибке.
Моя вторая попытка состояла в том, чтобы сначала сделать SELECT-query, проверка, если строка уже существует, и если num_rows больше 0, exit с сообщением об ошибке (и еще сделать INSERT-часть). Чтобы это работало, мне нужно будет использовать параметризованные запросы и для SELECT, так как я добавляю в него некоторые пользовательские данные. Поняв, что параметризованные запросы нуждаются в специальных функциях для всего, что вы обычно можете делать с меньшим количеством строк кода, я исследовал в Интернете, как получить num_rows из моего $ Statement параметризованный-оператор-объект. Вот что у меня было в итоге:

$connection = new mysqli('x', 'x', 'x', 'x');
if (mysqli_connect_error()) {
die("Connect Error");
}
$connection->set_charset("UTF-8");
$statement = $connection->stmt_init();
$statement = $connection->prepare('SELECT Name FROM test WHERE Name LIKE ?');
flags = "s";
$statement->bind_param($flags, $_POST["person_name"]);
$statement->execute();
$statement->store_result();
$result = $statement->get_result(); //Produces error
if ($result->num_rows >= 1) {
$output = "Your already registered";
} else {
$output = "Registering you...";
}
exit($output);

В конце концов, я не могу понять, почему MySQL все еще не дает мне num_rows из моего заявления. Любая помощь приветствуется, спасибо заранее!
О, и если бы вы, ребята, могли бы объяснить мне, что я должен сделать, чтобы получить affected_rows,это было бы круто!

РЕДАКТИРОВАТЬ: Я знаю, что мог бы к этому, используя уникальные ограничения. Я также узнал, что могу узнать, INSERT IGNORE пропустил INSERT или нет. Но это не ответит на мой полный вопрос: почему SELECT num_rows альтернатива не работает?

ДРУГОЕ РЕДАКТИРОВАНИЕ: Я изменил фрагмент кода на то, что у меня сейчас есть. Хотя моя версия mysql (i) кажется 5.6.33 (Я повторяю это через $connection->server_info) get_result () выдает следующее сообщение об ошибке:
Неустранимая ошибка: вызов неопределенного метода mysqli_stmt :: get_result () в X в строке X (строка get_result)

0

Решение

Поведение mysqli_num_rows() зависит от того, используются ли буферизованные или небуферизованные результирующие наборы. Для небуферизованных наборов результатов, mysqli_num_rows() не вернет правильное количество строк пока все строки в результате не будут получены. Обратите внимание, что если количество строк больше PHP_INT_MAX, номер будет возвращен в виде строки.

Также убедитесь, что вы объявляете ->store_result() первый. Кроме того, функция не работает с LIMIT используется совместно с SQL_CALC_FOUND_ROWS, Если вы хотите получить общее количество найденных строк, вы должны сделать это вручную.

РЕДАКТИРОВАТЬ:

Если из предложений ничего не работает, я бы предложил переписать ваш SQL-запрос:

 SELECT `Name`, (SELECT COUNT(*) FROM `Persons`) AS `num_rows` FROM `Persons` WHERE `Name` LIKE ?

Этот запрос вернет общее количество от вашего Persons стол, а также Name, если существует.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]