Определение того, почему идентичный запрос возвращает phpMyAdmin, но не при запуске в PHP - PullRequest
0 голосов
/ 30 января 2019

В настоящее время проблема заключается в том, что следующий запрос SQL находит и возвращает результат при запуске через страницу SQL phpMyAdmin, но не возвращает никаких результатов при запуске через сценарий PHP с использованием PDO.(поскольку не найдено ни одного совпадения)

Проблемный запрос:

SELECT `p_id` FROM `p_desc` WHERE `lang_id` = 1 AND (`p_name` LIKE '%nål%' OR `p_desc` LIKE '%nål%')

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

База данных использует параметры сортировки latin1_swedish_ci.Я попытался установить PDO :: MYSQL_ATTR_INIT_COMMAND в "SET NAMES" latin1 'COLLATION' latin1_swedish_ci ', а также попытался использовать utf8 или utf8mb4, сопровождаемый utf8_unicode_ci и т. Д.

Создание PDO:

$dsn = "mysql:host=" . self::$serverHost . 
          ";dbname=" . self::$databaseName . 
         ";charset=" . self::$charset;

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'' . self::$charset . '\'  COLLATE \'' . self::$collation . '\'',
];
$connection = new PDO($dsn, self::$username, self::$password, $options);

Где я выполняю запрос:

$conn = Database::getConnection();
$stmt = $conn->prepare('SELECT `p_id` FROM `p_desc` WHERE `lang_id` = ' . $langID . ' AND (`p_name` LIKE \'%' . $searchText . '%\' OR `p_desc` LIKE \'%' . $searchText . '%\')');
$stmt->execute();
$matchingIDs = $stmt->fetchAll();

Как указано выше, выполнение запроса в phpMyAdmin возвращает результаты сопоставления, как и ожидалось, но выполнение запроса в сценарии PHP не возвращает результатов сопоставления.

Сообщения об ошибках не генерируются.
Запросы идентичны.

Имейте в виду, что я новичок в PHP и MySQL и, возможно, что-то сделал неправильно, и любой ввод приветствуется.

1 Ответ

0 голосов
/ 30 января 2019

Я бы предложил использовать bindParam, вы можете узнать больше об этом в php руководстве с некоторыми действительно хорошими примерами в комментариях ниже.

Что касается приведенного выше сценария, вы можете попробовать это:

$conn = Database::getConnection();

$stmt = $conn->prepare('SELECT `p_id` FROM `p_desc` WHERE `lang_id` = :langID AND (`p_name` LIKE :searchText1 OR `p_desc` LIKE :searchText2)');

$stmt->bindParam(':langID', $langID);
$stmt->bindParam(':searchText1', '%' . $searchText . '%');
$stmt->bindParam(':searchText2', '%' . $searchText . '%');

$stmt->execute();
$matchingIDs = $stmt->fetchAll();
...