确定为什么相同的查询返回结果会导致phpMyAdmin而不是在PHP中运行

时间:2019-01-30 12:28:40

标签: php mysql sql pdo phpmyadmin

当前问题是,以下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的新手,可能做错了一些事情,感谢您的投入。

1 个答案:

答案 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();