Данные в БД есть, но РНР скрипт их не находит

Пишу код для того, что-бы выполнить поиск в БД, найти нужню строку и вытянуть информацию и сгенерировать пдф файл.

В базе данных при поиске через ее строку поиска все находит BD1 BD2

Вот мой php код:

<?php
// Подключение к базе данных
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "snm-database";

// Создание подключения
$conn = new mysqli($servername, $username, $password, $dbname);

// Пользовательский ввод load-number
$load_number = $conn->escape_string($_POST['load-number']);

// Поиск информации в базе данных
$sql = "SELECT * FROM load_information WHERE load_number = '$load_number'";
$result = $conn->query($sql);

// Вывод отладочной информации о выполнении запроса
echo "SQL query: $sql<br>";

if ($result->num_rows > 0) {
    // Генерация содержимого для PDF
} else {
    echo "Load number not found.";
}

Вот код html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="create-user.html">Create-user</a>
    <a href="log-in.html">Log In</a>
    <a href="create-broker.html">Create-broker</a>
    <a href="create-rate-confirmation.html">Add load to database</a>

    <form action="generate_pdf.php" method="post">
        <input type="text" name="load-number" placeholder="Enter Load Number">
        <button type="submit">Generate PDF</button>
    </form>
</body>
</html>

Всегда как ответ получаю:

SQL query: SELECT * FROM load_information WHERE load_number = '4142341241' Load number not found.


Ответы (1 шт):

Автор решения: Ипатьев

Если РНР код не находит в БД информацию, которая там "точно есть", это может быть вызвано различными причинами

Выполнение запроса с ошибками

В первую очередь вы должны убедиться, что запрос выполнился без ошибок. В старых версиях РНР база данных не извещает об ошибках самостоятельно. А при выключенных ошибках код в вопросе выведет как раз "Load number not found." даже если в БД нет такой таблицы.

Необходимо включить отображение ошибок как для РНР в целом, так и для драйвера базы данных, mysqli или PDO. В самом простейшем случае напишите в начале кода

ini_set('display_errors',1);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

И если после этого появятся ошибки, то читать и исправлять их. Если в ошибке будет сказано что-то вроде "no such table/database", см. пункт "Соединение с БД" ниже.

Проблемы с данными

Проверьте передаваемое в запрос значение. В нем могут содержаться невидимые или перекодированные символы, например символ перевода строки, или буква, которая выглядит нормально, но на самом деле это юникод-символ, или например кавычка, которая сконвертирована в HTML-сущность. К примеру, если в запрос передается строка <[email protected]> а в базе лежит &lt;[email protected]&gt;, то разумеется, ничего этот запрос не найдет.

Важно понимать, что выше приведены отдельные примеры, которые скорее всего не подходят для вашего случая. Тут важен сам принцип поиска проблемы. Для быстрой проверки передаваемого значения выведите его через функцию, которая отображает все символы, например bin2hex() или rawurlencode().

То же самое касается данных, лежащих в БД. Получите нужное значение по его id, и точно так же выведите через функцию, чтобы убедиться, что в нем нет лишних/посторонних символов. Скопируйте в текстовый редактор один под другим вывод функции bin2hex() как для значения в переменной, так и для значения из БД и сравните визуально.

Также могут быть проблемы с кодировками. Проверьте свою систему по вот этому списку (на английском)

Соединение с разными БД

На удивление довольно часто встречается такая ситуация, когда РНР соединяется с одной базой данных, а наличие данных вы смотрите в другой. Убедитесь, что и там и там используются одни и те же параметры подключения.

Проблемы со сложными условиями в SQL

Ещё раз проверьте свой SQL. Бывают взаимоисключающие условия, например WHERE col=1 AND col=2. Такой запрос никогда не вернет ни одной строки. Попробуйте постепенно упрощать условия, пока запрос не начнет возвращать хоть какие-то данные и затем меняйте условия чтобы получить нужный результат.

→ Ссылка