Поэтому я пытаюсь сравнить пользовательский ввод из формы с данными из базы данных, имени, фамилии и электронной почты. Моя проблема заключается в сравнении моих результатов с теми, которые пользователь вводит. То, что я пытаюсь сделать, - это поместить результаты моего запроса в массив, а затем сравнить каждый элемент массива со входом пользователя. Но я не могу пройти через свой процесс. Что я делаю не так?
Спасибо всем заранее.
PS Я новичок php, поэтому любые предложения также будут оценены
<?php
$servername = "localhost";
$username = "jon";
$password = "test";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname);
//test connection
if($conn -> connect_error) {
die("Connection Error: " . $conn -> connect_error);
}
//input from the user
$firstname = $_POST['first'];
$lastname = $_POST['last'];
$email = $_POST['email'];
//query for the database to select the columns
$queryFirst = "SELECT firstname FROM users";
$queryLast = "SELECT lastname FROM users";
$queryEmail = "SELECT email FROM users";
//query results
$resultFirst = $conn -> query($queryFirst);
$resultLast = $conn -> query($queryLast);
$resultEmail = $conn -> query($queryEmail);
$firstResult = array();
$lastResult = array();
$emailResult = array();
array_push($firstResult, $resultFirst);
array_push($lastResult, $resultLast);
array_push($emailResult, $resultEmail);
$firstValid = mysqli_result::fetch_array($firstResult);
$lastValid = mysqli_result::fetch_array($lastResult);
$emailValid = mysqli_result::fetch_array($emailResult);
//comparing query results to user input
foreach($firstResult as $comp) {
if(strpos($firstname, $comp) !== false) {
$firstname = true;
} else {
return false;
}
}
foreach($lastResult as $comp) {
if(strpos($lastname, $comp) !== false) {
$lastname = true;
} else {
return false;
}
}
foreach($emailResult as $comp) {
if(strpos($email, $comp) !== false) {
$email = true;
} else {
return false;
}
}
//redirection if successful or if failure
$success = "../loggedin.php";
$failure = "../fail.php";
if($firstname && $lastname && $email = true) {
header($success);
exit();
} else {
header($failure);
exit();
}
$conn -> close();
?>
Ладно, так что, как уже сказал вам andrewsi, вы можете получить всю информацию в одном запросе. Но если вы хотите выбрать только одну строку, вы должны использовать предложение WHERE, рассказывающее, что искать.
Проверь это:
<?php
$servername = "localhost";
$username = "jon";
$password = "test";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname);
//test connection
if($conn -> connect_error) {
die("Connection Error: " . $conn -> connect_error);
}
//input from the user . addslashes is for security, so they won't break your query and potentially abuse it.
$firstname = addslashes($_POST['first']);
$lastname = addslashes($_POST['last']);
$email = addslashes($_POST['email']);
//query for the database to select the columns
$query = "SELECT firstname, lastname, email FROM users WHERE firstname = '$firstname' and lastname = '$lastname' and email = '$email'";
//query results
$result = $conn -> query($query);
$numRows = $result->num_rows;
//redirection if successful or if failure
$success = "../loggedin.php";
$failure = "../fail.php";
if($numRows > 0) {
header($success);
exit();
} else {
header($failure);
exit();
}
$conn -> close();
?>
Не тестировали, но идея состоит в том, чтобы проверить соответствие в запросе, а не потом. Затем, если есть совпадение, оно вернет хотя бы одну строку (если вы правильно определили свою таблицу, у вас не должно быть дубликатов).
Тогда, основываясь на этом, вы сделаете свой выбор.
SELECT firstname, lastname, email FROM users
; Вы также можете использовать предложение WHILE, чтобы просто найти конкретную строку, которую вы ищете, вместо циклического перемещения по всей таблице.