PDO在单列上具有多个LIKE

时间:2018-02-17 16:05:18

标签: php pdo sql-like

我无法找到合适的答案,说明为什么我的PDO查询不能在同一列上使用多个“like”语句。使用Joomla框架时,我可以成功执行查询..我创建输出以显示查询:

Joomla核心查询功能输出

SearchValue: Array (
    [0] => Test
    [1] => Name
)

Query output from joomla "$query->__toString()" command:
    SELECT id,name
    FROM portal_users
    WHERE name LIKE '%Test%' AND name LIKE '%Name%'

**data Set**

id    name
1     Test Name
2     Other name
3     Test Example

**Query Results**

Test Name

但是当我使用PDO创建相同的查询时,它不会通过两个参数进行过滤,而是返回没有结果。

PDO提交和输出

SearchValue: Array (
    [0] => Test
    [1] => Name
)

Query submitted to PDO:
    SELECT id, name
    FROM portal_users
    WHERE name LIKE :var1 AND name LIKE :var2

PDO Data: Array (
    [:var1] => %Test%
    [:var2] => %Name%
)

**data Set**

id    name
1     Test Name
2     Other name
3     Test Example

**Query Results**

No results

我无法解释相同查询无法正常工作的原因,除非对PDO值的处理方式不同。任何意见都将不胜感激。

- UPDATE -

我已按照用户yourcommonsense的示例和请求创建了以下代码以验证我的问题:

// first let's create a table 
// note that table is temporary so it won't pollute your database
$createQuery = "CREATE temporary TABLE test_users (id int auto_increment primary key, name varchar(255))";
$db->query($createQuery);

// then fill it with sample data
$insertQuery = "INSERT INTO test_users (name) VALUES ('Test Name'),('Another Name'),('Test Example')";
$db->query($insertQuery);

// now let's see if we have our data back all right
$dataCheck = "SELECT name FROM test_users";
echo "Test Query on temp table:\n$dataCheck\n";
$data = $db->query($dataCheck)->fetchAll(PDO::FETCH_ASSOC);
echo print_r($data,true);

// now let's test with a hardcoded value
$hardCodedQuery = "
    SELECT id, name
    FROM `test_users`
    WHERE name LIKE '%test%' AND name LIKE '%name%'
";
echo "Harcoded Query on temp table:\n$hardCodedQuery\n";
$data = $db->query($hardCodedQuery)->fetchAll(PDO::FETCH_ASSOC);
echo print_r($data,true);

// and finally, with a prepared statement
$preparedQuery = "
    SELECT id, name
    FROM test_users
    WHERE name LIKE :var1 AND name LIKE :var2
";
echo "Prepared Query on temp table:\n$preparedQuery\n";
$stmt = $db->prepare($preparedQuery);
$vars = array(":var1" => '%Test%', ":var2" => '%Name%');
$stmt->execute($vars);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo print_r($data,true);

我看到他对我的理解是正确的,因为硬编码语句和此代码段中的预处理语句确实产生了我希望从上面的原始帖子得到的相同结果。我仍然无法解释为什么原始发布的查询不能以相同的方式工作。如前所述,我正在运行的Joomla查询和PDO查询具有相同的结构,但上面的PDO返回0结果的成功查询。我可能需要比较表结构?我将继续研究,但任何其他想法将不胜感激。

奇怪的是,在我的实际数据库上运行的MCVE代码正常运行,所以我必须看到我的实际页面与MCVE有什么不同。

Test Query on production table:
SELECT id, name FROM portal_users LIMIT 3
Array (
    [0] => Array ( [id] => 244 [name] => User One )
    [1] => Array ( [id] => 261 [name] => User Two )
    [2] => Array ( [id] => 262 [name] => User Three )
)

Harcoded Query on temp table:
    SELECT `users`.`id`,`users`.`name`
    FROM `portal_users` AS `users`
    WHERE `users`.`name` LIKE '%silver%' AND `users`.`name` LIKE '%tiger%'
Array (
    [0] => Array ( [id] => 7101 [name] => Silver Tiger )
)

Prepared Query on temp table:
    SELECT `users`.`id`, `users`.`name`
    FROM portal_users AS `users`
    WHERE  `users`.`name` LIKE :var1 AND `users`.`name` LIKE :var2

Supplied variables for prepared statement:
Array ( [:var1] => %silver% [:var2] => %tiger% )

Array (
    [0] => Array ( [id] => 7101 [name] => Silver Tiger )
)

即使我复制并粘贴我的PHP创建的查询,它也将通过Navicat在SQL查询窗口中执行并返回结果......

SELECT id, name
FROM portal_users
WHERE name LIKE CONCAT('%','sil','%') AND name LIKE CONCAT('%','tig','%')

但是当通过PHP PDO提交时?和变量数组,它没有结果。还在研究。

0 个答案:

没有答案