Определение того, почему идентичный запрос возвращает phpMyAdmin, но не при запуске в PHP

0

Текущая проблема заключается в том, что следующий запрос 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 и, возможно, сделал некоторые вещи неправильно, и любой вклад приветствуется.

Теги:
phpmyadmin
pdo

2 ответа

0

Не используйте одинарные кавычки в вашей строке и dbname в sql, потому что mysql предполагает, что имя в одинарных кавычках является специальным именем. Вы должны изменить это как:

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

Мой английский не очень хороший, поэтому позвольте мне привести пример.

    $phoneNum = "somevalue";
    $query= $db->prepare("select 'phoneNum' from users ");

Если вы используете одинарные кавычки 'phoneNum' примет значение $phoneNum

Если вы не используете его, выберите только phoneNum. Я надеюсь, вы понимаете мое объяснение

0

Я бы предложил использовать 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();
  • 0
    К сожалению, использование bindParam невозможно при наличии нескольких экземпляров одной и той же «привязки». Это означает, что использование: searchText более одного раза (что я и делаю) приводит к тому, что PDO генерирует исключение «Неверный номер параметра». Использование конкатенации строк является обходным решением этой проблемы.
  • 0
    Ах, хорошо, вы всегда можете иметь: searchText1 и: searchText2 и связать его дважды. Я отредактирую свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню