MySQL>更新查询在PDO类型时不起作用

时间:2017-05-17 11:02:19

标签: php mysql pdo

我正在处理此更新查询,但它不起作用..这是查询

UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE '%:sub_string%' THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', :sub_string) END) WHERE `field` = :value

我正在尝试这样做...如果子字符串存在于字段值中则更新一条记录然后返回字段值它自己...如果子字符串不存在则添加旧值。但问题是field_name LIKE '%:sub_string%'无法正常工作......如果我直接写field_name LIKE '%abc%'那么它就有效了。我想知道为什么这不起作用?

整个代码部分是..

$query = $conn->prepare("UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE '%:sub_string%' THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', :sub_string) END) WHERE `field` = :value");
$query->bindParam(':sub_string', 'abc');
$query->bindParam(':value', 1);
$query->execute();

我希望你们明白......

4 个答案:

答案 0 :(得分:2)

从实际查询中删除通配符,并将其与bindParams

一起添加
    <?php

    $myString = "abc";
    $value = 1;

    $query = $conn->prepare("UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE :sub_string1 THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', :sub_string) END) WHERE `field` = :value");
    $query->bindParam(':sub_string1', '%'.$myString.'%');
    $query->bindParam(':sub_string', $myString);
    $query->bindParam(':value', $value);
    $query->execute();

?>

还会删除参数

中的引号

更新

或者可以尝试使用问号占位符?

<?php

    $myString = "abc";
    $value = 1;

    $query = $conn->prepare("UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE ? THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', ?) END) WHERE `field` = ?");
    $query->bindParam(1, '%'.$myString.'%');
    $query->bindParam(2, $myString);
    $query->bindParam(3, $value);
    $query->execute();

?>

答案 1 :(得分:0)

您不能用引号括起参数,而是可以使用如下:

UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE :sub_string1 THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', :sub_string2) END) WHERE `field` = :value

然后

$query = $conn->prepare("UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE '%:sub_string%' THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', :sub_string) END) WHERE `field` = :value");
$query->bindParam(':sub_string1', '%abc%');
$query->bindParam(':sub_string2', 'abc');
$query->bindParam(':value', 1);
$query->execute();

答案 2 :(得分:0)

bindParam绑定到变量名而不是常量。 改为使用它 -

$abc = 'abc';
$one = 1;
$query->bindParam(':sub_string', $abc);
$query->bindParam(':value', $one);
  

PDOStatement :: bindParam - 将参数绑定到指定的变量名称

Relevant comment关于将%%与like和bindParam一起使用。

PHP Documentation- PDOStatement::bindParam

答案 3 :(得分:0)

PDO的bindParam将确保在发送到SQL查询时正确引用所有字符串数据

试试这个:

<?php

    $term = "random";
    $finalTerm= "$term%";
    $value = 1;

    $query = $conn->prepare("UPDATE `tbl_abc` SET `field_name` = (CASE WHEN `field_name` LIKE ? THEN `field_name` ELSE CONCAT(`field_name`, ' ### ', ?) END) WHERE `field` = ?");
    $query->bindParam(1, $finalTerm);
    $query->bindParam(2, $myString);
    $query->bindParam(3, $value);
    $query->execute();

?>