Выберите затем Вставить запрос PHP

Но могу ли я сначала проверить базу данных, если пользователь существует, а затем использовать оператор вставки, если его нет. В настоящее время код выполняет только оператор выбора.

<?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);
        }
    }
?>

Возможный дубликат проверьте, существует ли строка SQL с PHP

Vishnu Bhadoriya 23.03.2018 09:32
mysqli_query возвращает false только в случае ошибки, а не только потому, что возвращает пустой набор.
Federico klez Culloca 23.03.2018 09:32

Также просмотрите подготовленные операторы (ваши запросы подвержены SQL-инъекции).

Jeto 23.03.2018 09:33

mysqli_query возвращает объект mysqli_result для запросов SELECT, и ваша задача - проверить, содержит ли этот объект хотя бы одну строку.

Flocke 23.03.2018 09:34

Выполнение проверки, существует ли запись с SELECT, плохо, потому что это неточная информация. К тому времени, когда вы закончите проверку, другой процесс может вставить эту запись, и вы можете получить две одинаковые записи. Чтобы бороться с этой проблемой, мы используем ограничения unique, мы просто вставляем, и если база данных сообщает о duplicate key error, то мы знаем, что запись существует.

N.B. 23.03.2018 09:34

@ N.B. Происходит ли это в реальном приложении, где пользователи регистрируются, и оба запроса (SELECT и INSERT) выполняются так близко? Теоретически ДА, но ваши пользователи должны делать это намеренно и нуждаются в большой удаче. Поэтому я не использую unique constr. для имен пользователей. Возможно, пользователь удалит свою учетную запись (и вы только отметите его как удаленный в базе данных), тогда новые пользователи не смогут использовать это имя пользователя.

Flocke 23.03.2018 09:40

@Flocke - это не случай «а такое бывает?», Это случай создания системы, в которой нет таких дыр, как эта. Этого может не случиться сегодня, завтра, через полгода. Что, если это произойдет через 2 года? Однако интересный момент заключается в том, что создание уникального ограничения упрощает нам задачу, так как нам нужно вводить гораздо меньше кода. И это пуленепробиваемое, навсегда. Что касается мягкого удаления, вы всегда можете создать уникальное ограничение из (username, is_deleted) или хэша (username, is_deleted) и сохранить его как уникальное ограничение.

N.B. 23.03.2018 09:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
286
3

Ответы 3

<?
    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-инъекций. Пожалуйста, научите правильным техникам.

Joshua 23.03.2018 09:42

это результат 0 if ($ data ['total']> 0) {echo "пользователь уже существует"; mysqli_close ($ dbconn); } еще {mysqli_query ($ dbconn, $ query); }}?>

user2589992 23.03.2018 10:09

как я понял из вашего вопроса, вы хотите вставить пользователя, если он не существует, верно?

$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-инъекций. Пожалуйста, научите правильным техникам.

Joshua 23.03.2018 09:42

вы пытаетесь вставить нового пользователя, если он уже существует - возможно, вы ошиблись

niyou 23.03.2018 09:42

это редактирование не помогает - количество строк не будет <0

niyou 23.03.2018 09:45

вы можете использовать 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);
        }
    }

не работает. добавляет пользователя, даже если имя пользователя существует

user2589992 23.03.2018 10:08

проверьте свой запрос на phpmyadmin или покажите мне свою структуру db для имени пользователя таблицы

saqib kifayat 23.03.2018 10:11

Другие вопросы по теме