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