为什么我不能在MySQL查询中的LIKE选择器中使用PHP字符串变量?
$weekday = '%w%';
echo "$weekday";
$sql = "SELECT id FROM message_instance
WHERE day LIKE $weekday";
$result = $pdo->query($sql);
给我这个错误消息:"SQLSTATE[42000]: Syntax error or access violation: 1064你的SQL语法有错误;查看与MySQL服务器版本对应的手册,以确定在第2行
处'%w%'附近使用的正确语法。我试过用双引号括住变量。仍然得到错误。
如果我用'%w%'代替变量,它可以正常工作。
我在其他查询中使用PHP变量没有问题。我就是不明白。
编辑:对不起,我一定比我想象的还要累。你是对的,我发布了一个错误的查询。我尽了一切努力让这个与占位符一起工作,我不知道我做错了什么。
但我确实有一个问题,我不能得到。
try
{date_default_timezone_set ("Pacific/Honolulu");
$daynum=array ("s","m","t","w","h","f","a");
$weekday = strftime("%w");
$weekday = $daynum [$weekday];
//$weekday = "w";
$weekday = '%' . $weekday . '%';
//$weekday = "%w%";
echo "$weekday";
$sql = "SELECT id FROM message_instance
WHERE day LIKE :weekday";
$s = $pdo->prepare($sql);
$s->bindValue(':weekday', "$weekday");
$s->execute();
$result = $s->fetch();
foreach ($result as $row)
{
$messageids = array(
'id' => $row['id']); //THIS IS THE ERROR LINE
}
print_r ($messageids);
exit()
和单引号我让它以各种方式工作-抱歉。我真的遇到了一个完全不同的问题,我仍然无法理解。
我一直在使用PREPARED语句和BIND来保证安全性,然后以一种非常标准化的方式恢复数据,只是在这种情况下,我无法让它工作。
I get back:
Warning: Illegal string offset 'id' in C:xampphtdocs...gonogo.php on line 28
Warning: Illegal string offset 'id' in C:xampphtdocs...gonogo.php on line 28
Array ( [id] => 1 )
我已经使用这个fetch/foreach数组组合在其他地方没有问题。就是看不出哪里出了问题。这个数组应该包含1、4和5
如果您的字段类型不是整数(或者基于数字的),则需要用引号封装您的输入。
$sql = "SELECT id FROM message_instance WHERE day LIKE '$weekday'";
但是,请保护自己免受SQL注入攻击,并使用PDO的准备语句功能。
您缺少$weekday
:
$sql = "SELECT id FROM message_instance
WHERE day LIKE '$weekday'";
尝试替换:
$weekday = '%w%';
:
$weekday = "'%w%'";
输出通配符时需要用引号括住
你可以试试这个:
$weekday = 'w';
echo "$weekday";
$sql = "SELECT id FROM message_instance
WHERE day LIKE '%$weekday%'";
$result = $pdo->query($sql);`