- Вопрос или проблема
- Проблемы, вызванные ошибками SQL
- Проблемы, вызванные условием
- Проблемы, вызванные данными
- Проблемы, вызванные учетными данными для подключения
- Проблемы, вызванные набором символов/кодировкой
- Ответ или решение
- 1. Проверьте наличие ошибок в запросе
- 2. Проверьте условия вашего запроса
- 3. Проблемы с данными
- 4. Проверьте соединение с базой данных
- 5. Проблемы с кодировкой
- 6. Включите полное отображение ошибок
- Заключение
Вопрос или проблема
Я пытаюсь получить количество строк, чтобы проверить, есть ли уже такой же адрес электронной почты в базе данных или нет. Я попробовал несколько методов, но без успеха. Когда я выполняю свой запрос непосредственно в базе данных, он возвращает количество строк, но при использовании PDO execute возвращает 0.
Я использовал метод fetchAll, чтобы вручную подсчитать, даже использовал метод rowCount, но он тоже не работает.
$sql="SELECT count(*) FROM inbox WHERE uid = ? AND from_email = ?";
$result = $link->prepare($sql);
$result->execute([$email_number,$email_f]);
$number_of_rows = $result->fetchColumn();
Проблема в этом $email_f, он содержит html.
SELECT count(*) FROM inbox WHERE uid = "6961"
AND from_email = "abc Offers <[email protected]>"
Это запрос, который я напечатал из $sql, и когда я выполняю его в базе данных непосредственно в phpmyadmin, он работает нормально. Возвращает количество 3, но при использовании execute я получаю 0.
Прежде всего, вам нужно принять тот факт: если ваш запрос не нашел ни одной строки, это означает, что нет совпадений, даже если вы уверены, что данные правильные. Поэтому вам нужно разобраться, почему нет совпадений.
Проблемы, вызванные ошибками SQL
Прежде всего, вам нужно убедиться, что ваш запрос действительно выполняется без ошибок, поскольку “нет результата” может означать ошибку в запросе. Обратитесь к этим ответам для подробностей: pdo и mysqli.
Если ошибка говорит “такой таблицы/базы данных нет”, смотрите случай “данные для подключения” ниже.
Проблемы, вызванные условием
Проверьте свои условия. Существуют взаимно исключающие условия, такие как WHERE col=1 AND col=2
. Это никогда не вернет ни одной строки. Попробуйте упростить условие, пока оно не начнет возвращать какие-либо строки, а затем уточнять условия, чтобы получить желаемый результат.
Но все в порядке, ошибок нет, условия правильные, и вы можете поклясться, что в таблице есть данные, подходящие под ваш запрос. Тем не менее, есть некоторые подводные камни:
Проблемы, вызванные данными
Прежде всего, если переменная вовлечена, убедитесь, что она существует и действительно содержит какое-либо значение.
Затем проверьте само значение. В входных данных (или в базе данных) могут быть какие-либо преобразованные или невидимые символы. Например, символ перевода строки или странно закодированный символ, или некоторые символы, такие как <
и >
преобразованные в HTML-сущности. В результате запрос содержит <[email protected]>
никогда не совпадет с текстом <[email protected]>
. Для быстрой проверки вы можете использовать функцию rawurlencode()
, она преобразует все нелатинские символы в коды, тем самым делая их видимыми.
Проблема в том, что это всего лишь предположение, и никто не может сказать вам, в чем на самом деле проблема, потому что это ваша база данных, ваши входные данные и только вы можете найти проблему.
Я написал статью, которая объясняет как отлаживать ваши проблемы с PDO.
Чтобы отладить конкретную проблему, вам нужно
- убедитесь, что полная отчетность об ошибках включена как для PDO, так и для PHP. Это действительно помогает, показывая случайные опечатки, ошибки написания и тому подобное
- тщательно проверьте как данные в базе данных, так и входные данные, чтобы найти разницу. Функция
urlencode()
поможет, выявляя все невидимые и преобразованные символы как в базе данных, так и во входных данных.
Проблемы, вызванные учетными данными для подключения
Еще одной частой проблемой является ошибка, когда у вас несколько баз данных и вы соединяетесь с неправильной, в которой нет запрашиваемых данных. Эта проблема похожа на это, поэтому просто следуйте той же процедуре, только проверяя не список таблиц, а строки данных.
Проблемы, вызванные набором символов/кодировкой
Это редкий случай, но просто чтобы убедиться, выполните контрольный список из этого отличного ответа.
Ответ или решение
Проблема, с которой вы столкнулись, довольно распространенная при работе с базами данных и PDO. Сначала необходимо понять, почему ваш запрос возвращает 0 строк. Давайте разберем основные возможные причины и возможные решения.
1. Проверьте наличие ошибок в запросе
Первое, что необходимо сделать — убедиться, что ваш запрос выполняется без ошибок. Ошибки в запросе могут привести к отсутствию результата. Для этого вы можете использовать метод errorInfo()
после выполнения запроса:
$result = $link->prepare($sql);
$result->execute([$email_number, $email_f]);
$errorInfo = $result->errorInfo();
if ($errorInfo[0] != '00000') {
echo 'Error: ' . $errorInfo[2];
}
2. Проверьте условия вашего запроса
Одна из причин, по которой ваш запрос может не возвращать строки, — это неправильно заданные условия. Убедитесь, что переменные $email_number
и $email_f
имеют правильные значения и формат. Возможно, вы можете упростить условия для проверки:
$sql = "SELECT COUNT(*) FROM inbox WHERE uid = ?";
$result = $link->prepare($sql);
$result->execute([$email_number]);
$number_of_rows = $result->fetchColumn();
Если это возвращает значение, значит, проблема в условии с from_email
.
3. Проблемы с данными
Проверьте, действительно ли значение переменной $email_f
содержит корректные данные. Возможно, в нем есть неявные пробелы или символы, которые мешают корректному сравнению. Вы можете использовать var_dump
или print_r
для отладки:
var_dump($email_f);
Также учитывайте, что HTML-код в from_email
может не совпадать с тем, что хранится в базе данных. Убедитесь, что оба значения совпадают по форме и содержанию. Если в базе данных хранится значение без HTML-тегов, попробуйте удалить теги из $email_f
, используя strip_tags()
:
$email_f_clean = strip_tags($email_f);
4. Проверьте соединение с базой данных
Также убедитесь, что вы подключены к правильной базе данных. Если у вас есть несколько баз данных, возможно, вы выполняете запрос в той базе, где данных нет. Проверьте настройки подключения к базе данных.
5. Проблемы с кодировкой
Реже встречается проблема с кодировкой символов. Убедитесь, что база данных и PHP используют одинаковую кодировку. Чтобы установить кодировку UTF-8, выполните следующий SQL-запрос непосредственно после подключения:
$link->exec("SET NAMES 'utf8'");
6. Включите полное отображение ошибок
На время отладки включите полное отображение ошибок в PHP и PDO, чтобы оперативно видеть возможные проблемы. Добавьте следующее в начале вашего скрипта:
error_reporting(E_ALL);
ini_set('display_errors', 1);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Заключение
После проверки всех этих пунктов, если проблема сохраняется, может быть полезным произвести детальное сравнение данных в базе данных и вводимых данных. Также стоит рассмотреть возможность использования методов, таких как urlencode()
или htmlentities()
, для сопоставления данных, чтобы выявить любые скрытые различия.
Если ни один из вышеуказанных методов не решает вашу проблему, please, уточните детали: предоставьте содержимое переменных и структуру таблицы. Это поможет более глубоко разобраться в возникшей ситуации.