无法通过PDO执行查询

时间:2017-07-27 12:48:57

标签: php mysql sql pdo

我有一堆行,nieaktualny列(TINYINT(1))从0到1修改为email_1字段等于数组$sprawdzone_temp中的值的所有行。我通过exec()prepare()execute()尝试了很多方法,但似乎都没有用,我只是不明白为什么。尝试/捕捉时不会弹出错误。当我使用phpMyAdmin时,查询工作正常。

这是我的PHP:

$sql  = "UPDATE database.table SET `nieaktualny` = '1' WHERE `email_1` LIKE ?";
$stmt = $db->prepare($sql);
foreach($sprawdzone_temp as $email) {
    $stmt->execute(array($email));
}

包含数据的数组很好,我想如何使用PDO似乎有问题。

2 个答案:

答案 0 :(得分:1)

我怀疑您的$sprawdzone_temp可能没有{{3}}

通配符用于替换字符串中的任何其他字符。

通配符与SQL LIKE运算符一起使用。 LIKE运算符在WHERE子句中用于搜索列中的指定模式。

有两个通配符与LIKE运算符一起使用:

  1. (%) - 百分号表示零个,一个或多个字符
  2. 2。 (_) - 下划线表示单个字符

    因此,您的代码应该遵循这些方针:

    <?php
    
    $sprawdzone_temp = "%".$sprawdzone_temp."%";
    $sql  = "UPDATE database.table SET `nieaktualny` = 1 WHERE `email_1` LIKE ?";
    $stmt = $db->prepare($sql);
    foreach($sprawdzone_temp as $email) {
        $stmt->execute(array($email));
    }
    
    if(!$stmt){
    
    echo "\nPDO::errorInfo():\n";
    print_r($db->errorInfo());  
    }
    
    ?>
    

    <强>更新

    我建议您也尝试使用SQL IN运算符,它允许您在WHERE子句中指定多个值。

    IN运算符是多个OR条件的简写。

    <?php
    
    $sprawdzone_temp = array($nadawca);
    
    $in = str_repeat('?,', count($sprawdzone_temp) - 1) . '?';
    
    $sql  = "UPDATE database.table SET `nieaktualny` = 1 WHERE `email_1` in($in)";
    $stmt = $db->prepare($sql);
    $stmt->execute($sprawdzone_temp);
    if (!$stmt) {
        echo "\nPDO::errorInfo():\n";
        print_r($db->errorInfo());
    } else {
    
        echo "record updated";
    }
    
    ?>
    

答案 1 :(得分:0)

<强> TL;博士 我必须将strip_tags应用于稍后在PDO查询中使用的电子邮件。

问题与查询无关。来自$sprawdzone_temp阵列的电子邮件未正确准备。当我print_r对数组进行编辑时,它看起来正常,只有正确的电子邮件地址没有任何空格或类似。当我将它们从print_r复制粘贴到phpMyAdmin时,查询工作正常,但似乎有一些非法字符正在中断SQL查询的LIKE条件。

我已修复当我在将strip_tags数组插入电子邮件地址时随机尝试应用$sprawdzone_temp时。现在它有效。只是出于好奇 - 我可以以某种方式打印出所有角色 - 只是为了检查那里导致PDO查询停止的角色?