当前问题是,以下SQL查询在通过phpMyAdmin SQL页面运行时查找并返回结果,但在通过使用PDO的PHP脚本运行时不返回任何结果。 (因为找不到匹配的结果)
问题查询:
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设置为“设置名称'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的新手,可能做错了一些事情,感谢您的投入。
答案 0 :(得分:0)
我建议使用bindParam,您可以在php manual中阅读有关此内容的更多信息,并在下面的注释中提供一些非常好的示例。
关于上述脚本,您可以尝试以下操作:
$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();