MySQL中的PHP变量查询WHILE字符串中断

时间:2014-07-25 01:07:47

标签: php mysql

为什么我不能在MySQL查询中的LIKE选择器中使用PHP字符串变量?

$weekday = '%w%';
echo "$weekday"; 
$sql = "SELECT id FROM message_instance
            WHERE day LIKE $weekday";   
$result = $pdo->query($sql);

给出了以下错误消息:“SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以便在'%'附近使用正确的语法w%'在第2行“

我在变量周围用双引号试了一下。仍然得到错误。

如果我用'%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来保证安全性,然后以非常标准化的方式恢复数据,只是在这种情况下,我无法让它工作。

我回来了:

Warning: Illegal string offset 'id' in C:\xampp\htdocs\...\gonogo.php on line 28
Warning: Illegal string offset 'id' in C:\xampp\htdocs\...\gonogo.php on line 28
Array ( [id] => 1 )

我在其他地方使用过这个fetch / foreach数组组合没有问题。只是看不出这出错的地方。该数组应包含1,4和5。

4 个答案:

答案 0 :(得分:0)

您遗漏了$weekday周围的单引号:

$sql = "SELECT id FROM message_instance
        WHERE day LIKE '$weekday'";   

答案 1 :(得分:0)

如果您的字段类型不是整数(或基于数字,则为此),您需要使用引号封装输入。

$sql = "SELECT id FROM message_instance WHERE day LIKE '$weekday'";

但是,请保护自己免受SQL injection attacks的攻击并使用PDO's prepared statements feature

答案 2 :(得分:0)

尝试更换:

$weekday = '%w%';

使用:

$weekday = "'%w%'";

输出时,您需要在通配符周围引用。

答案 3 :(得分:0)

您可以尝试这样做:

$weekday = 'w';
echo "$weekday"; 
$sql = "SELECT id FROM message_instance
        WHERE day LIKE '%$weekday%'";   
$result = $pdo->query($sql);`