2017-07-27 107 views
-1

我有一堆行的nieaktualny列(TINYINT(1))从0修改为1,所有行的email_1字段等于来自数组$sprawdzone_temp的值。我尝试了很多方法,通过exec(),prepare(),​​但似乎没有工作,我只是不知道为什么。尝试/捕捉时不会出现错误。当我使用phpMyAdmin时,查询工作得很好。无法通过PDO执行查询

这里是我的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。

+0

您是否检查过Web服务器的错误日志?让我们看看你的try/catch语句。 –

+3

'nieaktualny' ='1'你传递字符串值而不是布尔值 –

+0

我对'$ sprawdzone_temp'感兴趣吗? –

回答

1

我怀疑你$sprawdzone_temp可能没有SQL Wildcard Characters

通配符来代替字符串中的任何其它字符(S)。

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

有配合使用LIKE运算两个通配符:

  1. (%) - 百分号表示零个,一个或多个字符

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"; 
} 

?> 
+0

是的,我已经尝试过:数组是用$ sprawdzone_temp [] =“%”。$ nadawca。“%”编写的。 –

+0

仍然没有得到结果?最新的错误信息是什么? –

+0

无。不是来自error_reporting(E_ALL),也不是来自try/catch。是不是我必须使用某种bind_param? –

0

TL;博士 我不得不申请strip_tags到后来在PDO查询所使用的电子邮件。

该问题不在与查询相关的任何事情中。来自$sprawdzone_temp阵列的电子邮件没有正确准备。当我print_r'编辑数组时,它看起来很正常,只是没有任何空格或类似的正确的电子邮件地址。当我将它们从print_r复制粘贴到phpMyAdmin时,查询运行良好,但看起来有一些非法字符中断了SQL查询的LIKE条件。

我已经修复了当我在将电子邮件地址插入到$sprawdzone_temp阵列时随机尝试应用strip_tags。现在它可以工作。出于好奇 - 我能以某种方式打印所有字符 - 只是为了检查导致PDO查询停止的字符是什么?

相关问题