PHP: вставить в базу данных MySQL и проверить, если уже существует - с параметрами привязки - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь вставить тестовые данные в базу данных MySQL, используя приведенные ниже строки, которые пока работают нормально.

1) Как я могу проверить, существует ли электронное письмо в базе данных, и если, повторить сообщение? Я видел здесь ссылки на использование WHERE EXISTS или mysqli_num_rows, но я не уверен, что и как здесь применять - в сочетании с параметрами привязки.
2) Я наткнулся на unset($username, $password, $database);, чтобы сделать этот запрос более безопасным,Это то, что нужно / полезно здесь, и если, где я должен это поместить?

Мой PHP:

$conn = new mysqli($host, $username, $password, $database);
if($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$stmt = $conn->prepare("INSERT INTO cust (email, pw) VALUES (?, ?)");
$stmt->bind_param("ss", $email, $hashPw);

$email = "me@mail.com";
$pw = "testpw12345";                
$hashPw = password_hash($pw, PASSWORD_DEFAULT); 
$stmt->execute();

echo "Success";

$stmt->close();
$conn->close();

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Альтернатива предложенному решению.

$stmt = $conn->prepare("SELECT COUNT(1) FROM cust WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$emailExists = $stmt->get_result()->fetch_row()[0];
if ($emailExists) {
    echo "This email address is already in use";
} else {
    // continue with insert code
}

Этот подход не требует, чтобы вы закрывали утверждение. После выполнения get_result данные оператора извлекаются полностью.
Это решение также потенциально может повысить производительность. Если ваша таблица содержит много столбцов с большим количеством данных, то выборка этих данных только для того, чтобы проверить, существует ли запись, является пустой тратой ЦП. Просто выберите COUNT(1) и проверьте один столбец одной возвращенной записи. Если оно равно 0, значение ложно, если оно больше, чем ваш оператор if примет значение true, и будет отображено сообщение. Я также настоятельно рекомендую структурировать ваш код так, чтобы вам редко приходилось использовать exit.

0 голосов
/ 04 октября 2019

Чтобы проверить, существует ли электронное письмо в базе данных, просто попробуйте выбрать строку с ним в:

$stmt = $conn->prepare("SELECT * FROM cust WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
    echo "This email address is already in use";
    exit;
}
$stmt->close();
// continue with insert code

Что касается других ваших вопросов, я не вижу причин для сброса переменныхи использование подготовленных запросов и password_hash дает вам как можно лучшую защиту.

...