В моем тестовом окружении есть база данных, содержащая некоторую личную информацию (имя, адрес электронной почты, адрес и т. Д.). Эта информация может быть вставлена кем-либо в базу данных через форму. На заднем плане они вставляются с параметризованным 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
)
Поведение 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
, если существует.
Других решений пока нет …