Но могу ли я сначала проверить базу данных, если пользователь существует, а затем использовать оператор вставки, если его нет. В настоящее время код выполняет только оператор выбора.
<?php
include_once('includes/dbconn.php');
if (isset($_POST['submitted'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$query_check_user = "SELECT username FROM Users WHERE username = '$user'";
$query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";
if (mysqli_query($dbconn, $query_check_user)) {
echo "user already exists";
mysqli_close($dbconn);
}else{
mysqli_query($dbconn, $query);
}
}
?>
mysqli_query возвращает false только в случае ошибки, а не только потому, что возвращает пустой набор.
Также просмотрите подготовленные операторы (ваши запросы подвержены SQL-инъекции).
mysqli_query возвращает объект mysqli_result для запросов SELECT, и ваша задача - проверить, содержит ли этот объект хотя бы одну строку.
Выполнение проверки, существует ли запись с SELECT, плохо, потому что это неточная информация. К тому времени, когда вы закончите проверку, другой процесс может вставить эту запись, и вы можете получить две одинаковые записи. Чтобы бороться с этой проблемой, мы используем ограничения unique, мы просто вставляем, и если база данных сообщает о duplicate key error, то мы знаем, что запись существует.
@ N.B. Происходит ли это в реальном приложении, где пользователи регистрируются, и оба запроса (SELECT и INSERT) выполняются так близко? Теоретически ДА, но ваши пользователи должны делать это намеренно и нуждаются в большой удаче. Поэтому я не использую unique constr. для имен пользователей. Возможно, пользователь удалит свою учетную запись (и вы только отметите его как удаленный в базе данных), тогда новые пользователи не смогут использовать это имя пользователя.
@Flocke - это не случай «а такое бывает?», Это случай создания системы, в которой нет таких дыр, как эта. Этого может не случиться сегодня, завтра, через полгода. Что, если это произойдет через 2 года? Однако интересный момент заключается в том, что создание уникального ограничения упрощает нам задачу, так как нам нужно вводить гораздо меньше кода. И это пуленепробиваемое, навсегда. Что касается мягкого удаления, вы всегда можете создать уникальное ограничение из (username, is_deleted) или хэша (username, is_deleted) и сохранить его как уникальное ограничение.






<?
include_once('includes/dbconn.php');
if (isset($_POST['submitted'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$user = $_POST['user'];
$pass = $_POST['pass'];
//Query for count
$query_check_user = "SELECT count(*) as total FROM Users WHERE username = '$user'";
$query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";
//Execute query for count
$result = mysqli_query($dbconn, $query_check_user);
//Fetch result
$data = mysqli_fetch_assoc($result);
//Check if count >0
if ($data['total']>0) {
echo "user already exists";
mysqli_close($dbconn);
}else{
mysqli_query($dbconn, $query);
}
}
?>
Ваш ответ уязвим для атак с использованием sql-инъекций. Пожалуйста, научите правильным техникам.
это результат 0 if ($ data ['total']> 0) {echo "пользователь уже существует"; mysqli_close ($ dbconn); } еще {mysqli_query ($ dbconn, $ query); }}?>
как я понял из вашего вопроса, вы хотите вставить пользователя, если он не существует, верно?
$query_check_user = "SELECT username FROM Users WHERE username = '$user'";
$b = mysqli_query($dbconn,$query_check_user);
$a = mysqli_num_rows($b);
if ($a<0):
mysqli_query(dbconn, "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')");
endif;
Ваш ответ уязвим для атак с использованием sql-инъекций. Пожалуйста, научите правильным техникам.
вы пытаетесь вставить нового пользователя, если он уже существует - возможно, вы ошиблись
это редактирование не помогает - количество строк не будет <0
вы можете использовать mysqli_num_rows();, чтобы проверить число, если результат больше, чем 0, то пользователь существует, иначе вставьте данные пользователя.
мой пример:
include_once('includes/dbconn.php');
if (isset($_POST['submitted'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$query_check_user = "SELECT username FROM Users WHERE username = '$user'";
$query_result = mysqli_query($query_check_user);
$query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";
if (mysqli_num_rows($query_result) > 0) {
echo "user already exists";
mysqli_close($dbconn);
}else{
mysqli_query($dbconn, $query);
}
}
не работает. добавляет пользователя, даже если имя пользователя существует
проверьте свой запрос на phpmyadmin или покажите мне свою структуру db для имени пользователя таблицы
Возможный дубликат проверьте, существует ли строка SQL с PHP