Вопрос или проблема
У меня есть следующий код для извлечения адресов, который просто не дает никаких результатов, так как не осуществляет связь с моей SQL базой данных. Я проверял, выводя два значения $field
и $search
, и они извлекаются из формы. Но я не могу передать их в мой SQL-запрос.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Форма поиска</title>
</head>
<form action="addsearch.php" method="POST">
<Select NAME="field">
<Option VALUE="Name">Фамилия</option>
<Option VALUE="First">Имя</option>
<Option VALUE="Comments">Комментарии</option>
</Select>
<input type="text" name="query" placeholder="Поиск...">
<input type="submit" value="Критерии поиска">
</form>
</body>
</html>
<?PHP
$INC_DIR = $_SERVER["DOCUMENT_ROOT"]. "/include/";
include($INC_DIR. "*****");
$conn = mysqli_connect($hostName, $userName, $password, $databaseName);
// Проверка соединения
if (!$conn) {
die('Не удалось подключиться: ' . mysqli_error($conn));
}
$field = $_POST['field'];
$search = $_POST['query'];
echo "Выбранное поле: ".$field."<br>";
echo "Искомый элемент: ".$search."<br>";
if (isset($_POST['query'])) {
$search = $conn->real_escape_string($_POST['query']);
$sql = "SELECT * FROM addresses WHERE '$field' LIKE '%$search%' ";
$find = $_POST['query'];
$result = $conn->query($sql);
$rowcount=mysqli_num_rows($result);
echo "<center>Вы искали <i>".$find."</i><br>";
echo $rowcount." случаев соответствуют вашим параметрам<br><br><br></center>";
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "Адрес: " . $row["id"].". "."<b>".$row["Last"]."</b>,".$row["First"]." <br>";
echo $row["Mobile"]."<br>";
echo $row["Comments"];
echo "<br><br>";
}
} else {
echo "0 результатов не найдено. Попробуйте снова";
}
}
$conn->close();
?>
</body>
</html>
Я передал значения формы как $field = $_POST['field'];
и $search = $_POST['query'];
. Я затем вывел эти значения, чтобы проверить, что они правильно извлечены – они такие.
Затем я перешел к соединению с базой данных и проверке ISSET и затем попытался найти искомое слово в переменной $search в поле переменной $field
. Форма передает запрос, чтобы отобразить то, что я искал, но не дает никаких результатов из SQL базы данных по соответствующим записям.
Ответ или решение
Проблема, которую вы описали, заключается в том, что значения из выпадающего списка и текстового поля корректно передаются, но запрос к базе данных не выполняется должным образом. Давайте убедимся, что все шаги правильно реализованы. Я внесу некоторые изменения в ваш код, чтобы исправить ошибки и улучшить его.
-
Использование обратных кавычек в SQL-запросе: Ваша ошибка заключается в том, что вы используете одинарные кавычки вокруг переменной
$field
. Это приводит к тому, что SQL интерпретирует это как строку, а не как имя поля. Вам нужно обернуть имя столбца в обратные кавычки. -
Проверка наличия значений: Убедитесь, что вы проверяете запрос перед выполнением SQL, чтобы избежать ошибок.
Вот исправленный код с учетом вышеизложенного:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Search Form</title>
</head>
<body>
<form action="addsearch.php" method="POST">
<select name="field">
<option value="Last">Last</option>
<option value="First">First</option>
<option value="Comments">Comments</option>
</select>
<input type="text" name="query" placeholder="Search...">
<input type="submit" value="Search Criteria">
</form>
<?php
$INC_DIR = $_SERVER["DOCUMENT_ROOT"]. "/include/";
include($INC_DIR. "*****");
$conn = mysqli_connect($hostName, $userName, $password, $databaseName);
// Проверка соединения
if (!$conn) {
die('Не удалось подключиться: ' . mysqli_error($conn));
}
if (isset($_POST['query']) && isset($_POST['field'])) {
$field = $conn->real_escape_string($_POST['field']);
$search = $conn->real_escape_string($_POST['query']);
echo "Выбранное поле: ".$field."<br>";
echo "Иск Item: ".$search."<br>";
$sql = "SELECT * FROM addresses WHERE `$field` LIKE '%$search%'";
$result = $conn->query($sql);
if ($result) {
$rowcount = mysqli_num_rows($result);
echo "<center>Вы искали <i>".$search."</i><br>";
echo $rowcount." случаев соответствуют вашим параметрам<br><br><br></center>";
if ($rowcount > 0) {
while($row = $result->fetch_assoc()) {
echo "Адрес: " . $row["id"].". <b>".$row["Last"]."</b>, ".$row["First"]." <br>";
echo $row["Mobile"]."<br>";
echo $row["Comments"];
echo "<br><br>";
}
} else {
echo "Результатов не найдено. Попробуйте снова.";
}
} else {
echo "Ошибка выполнения запроса: " . $conn->error;
}
}
$conn->close();
?>
</body>
</html>
Объяснение изменений:
-
Использованы обратные кавычки: Запрос теперь использует обратные кавычки для обертывания
$field
, что позволяет MySQL правильно интерпретировать это как имя столбца. -
Проверка на наличие значений: Код проверяет, заданы ли оба значения
$_POST['query']
и$_POST['field']
перед выполнением запроса. -
Обработка ошибок: Добавлен блок, который выводит ошибки SQL, если запрос не удается.
-
Улучшенно именование: Изменил
VALUE
атрибуты опций на "Last", "First", и "Comments", чтобы соответствовать вашим ожиданиям о поиске по полям.
Теперь ваш код должен корректно передавать значения из выпадающего списка и текстового поля, а также выполнять поиск по базе данных и отображать результаты.