PHP: умереть, когда вставлено то же значение в таблицу - PullRequest
0 голосов
/ 03 июня 2019

У меня есть простой код, где значение INSERTED, когда его еще нет в таблице, и

Я пытался создать код, когда значение не INSERTED для сценария таблицы умирает, или выполнить другое действие, чтобы показать, например, значениеуже вставлен, но мой код не работает.Сценарий добавляет значение только тогда, когда его нет в таблице, а когда значение находится в таблице, добавьте значение, и сценарий продолжает выполнять запрос AJAX.Может быть, когда ajax выполнено (значение добавлено в таблицу) и ajax завершится неудачей (значения не добавлено) и произойдет что-то другое, не относящееся к делу.

$emaildb = mysqli_connect("localhost", "root", "root", "dbdbdb");

if($emaildb === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$email = mysqli_real_escape_string($emaildb, $_REQUEST['email']);

$sql = "INSERT INTO emails (email)
        SELECT '$email'
        FROM DUAL
        WHERE NOT EXISTS 
            (SELECT 1
            FROM emails
            WHERE email = '$email')
        LIMIT 1";

$result = mysqli_query($emaildb, $sql);

while($row = mysqli_fetch_object($result)) {
    if (isset($row->blocked)) {
        die('Denied!');
    } else {
        echo 'Access!';
    }
}

mysqli_close($emaildb);

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Правильный сценарий SELECT и INSERT, подобный вашему, выглядел бы примерно так:

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // enable exception mode
$mysqli = new mysqli("localhost", "dbuser", "dbpass", "test");

if ($mysqli->connect_errno) {
    throw new \Exception("ERROR: Could not connect. " . $mysqli->connect_error);
}

if (isset($_REQUEST['email'])) {
    $selectStmt = $mysqli->prepare('SELECT COUNT(1) FROM emails WHERE email=?');
    $selectStmt->bind_param('s', $_REQUEST['email']);
    $selectStmt->execute();
    $found = $selectStmt->get_result()->fetch_array()[0];
    if ($found) {
        echo 'This email already exists!';
    } else {
        $insertStmt = $mysqli->prepare('INSERT INTO emails(email) VALUES (?)');
        $insertStmt->bind_param('s', $_REQUEST['email']);
        $insertStmt->execute();

        echo 'Email has been added';
    }
}

Я использовал подготовленные операторы и выполнил два отдельных запроса.Чтобы упростить процесс, я также включил режим исключений MySQLi.
Этот код сначала проверит, существует ли электронная почта в БД, и, если ее нет, попытается вставить ее.Старайтесь избегать die() -го в вашем коде, это никогда не будет хорошей практикой.

Этот пример кода без AJAX.Вам необходимо адаптировать это к вашему конкретному приложению и реализовать некоторую проверку ошибок.Этот код предназначен только для того, чтобы показать рекомендуемый способ выполнения операторов SQL.

0 голосов
/ 03 июня 2019

Вы можете использовать mysqli_insert_id, который будет возвращать 0, если ничего не вставлено:

<?php

$emaildb = mysqli_connect("localhost", "root", "root", "dbdbdb");

if(!$emaildb) {
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$email = mysqli_real_escape_string($emaildb, $_REQUEST['email']);

$sql = "INSERT INTO emails (email)
        SELECT '$email'
        FROM DUAL
        WHERE NOT EXISTS 
            (SELECT 1
            FROM emails
            WHERE email = '$email')
        LIMIT 1";

$result = mysqli_query($emaildb, $sql);
if(mysqli_insert_id($emaildb) == 0) {
    echo "DIE!";
} else {
    echo "Access";
}

mysqli_close($emaildb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...