MySQL Update SET替换为PHP多个查询

时间:2015-05-07 20:41:54

标签: php mysql

我正在尝试运行3行相同的代码,如下所示。我也尝试过W3Schools PHP mysqli_multi_query()函数但是它给了我一个语法错误,只有第一行代码才能运行{ {1}}

我还阅读了几篇有关此内容的stackoverflow帖子,这无法解决这个问题

ExistingWord1

这是我试图运行的完整代码,它本身只运行第一个$ sql =“”

并忽略其他2

至于REPLACE中的变量

<?php
include 'words.php';
include('../config.php');
$servername = DB_HOSTNAME;
$username = DB_USERNAME;
$password = DB_PASSWORD;
$dbname = DB_DATABASE;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
/*UTF-8 format*/
$conn->set_charset("utf8");

$sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord1', '$ReplacerWord1') WHERE name LIKE '%$SearchWord1%';";
$sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord2', '$ReplacerWord2') WHERE name LIKE '%$SearchWord2%';";
$sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord3', '$ReplacerWord3') WHERE name LIKE '%$SearchWord3%';";

if ($conn->query($sql) === TRUE) {
    echo "Products updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

$conn->close();
?>

感谢帮助人员

这篇文章中的每个人都非常有帮助我真的很喜欢它。

3 个答案:

答案 0 :(得分:2)

为什么不嵌套REPLACE函数,并一举完成。

  SET t.name = REPLACE(REPLACE(REPLACE( t.name, 'fee','bah'),'fi','hum'), 'fo','bug')

如果您打算扫描整张桌子,那么您真的不需要WHERE子句。

 WHERE t.name LIKE '%fee%'
    OR t.name LIKE '%fi%'
    OR t.name LIKE '%fo%'

这只需要扫描表格。

但这种方法只适用于#34;如果你没有&#34;交换&#34;关键字,并没有碰撞。 (例如,首先用'&#34; foo&#34;替换&#34; foo&#34;以及&#34; foo&#34;用&#34; bar&#34; ...替换&#34;费用&#34; ...操作的顺序很重要。

注意:

REPLACE函数替换字符串,而不是单词。如果您打算针对文本或评论运行此功能,这一点很重要。

在SQL文本中包含可能不安全的值的代码是易受攻击的SQL注入。

潜在不安全的值必须使用例如正确转义mysql_real_escape_string

或者,首选模式是使用预备语句绑定占位符

启用多重查询可为整个主机提供更多机会,甚至可以 nastier SQL注入;能够在整个语句中滑动,例如DROP TABLE语句。不要启用多重查询,直到您肯定您的代码不容易受到攻击。

<强>后续

首选模式是使用预备语句绑定占位符

我更喜欢用表格中的一次扫描进行替换,而不是三次。 LIKE '%...'条款中的WHERE谓词不可思议,无论如何都会完整扫描。

$sql = "UPDATE product_description SET name = REPLACE(REPLACE(REPLACE(name,?,?)?,?)?,?)
         WHERE name LIKE CONCAT('%',?,'%')
            OR name LIKE CONCAT('%',?,'%')
            OR name LIKE CONCAT('%',?,'%') ";

$sth=$conn->prepare($sql);
$sth->bind_param("sssssssss",$ExistingWord1,$ReplacerWord1
                            ,$ExistingWord2,$ReplacerWord2
                            ,$ExistingWord3,$ReplacerWord3
                            ,$SearchWord1
                            ,$SearchWord2
                            ,$SearchWord3
                );

$sth->execute();

(在prepareexecute调用周围添加相应的错误检查。使用PDO,我们使用try / catch / finally块。)

答案 1 :(得分:2)

根据提供的片段,只会执行最后$sql个值,因为您重新定义了相同的变量3次,只有最后一个值存储在var $sql中。

要解决此问题,您可以尝试:

$sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord1', '$ReplacerWord1') WHERE name LIKE '%$SearchWord1%';";
$sql .= "UPDATE product_description SET name = REPLACE(name, '$ExistingWord2', '$ReplacerWord2') WHERE name LIKE '%$SearchWord2%';";
$sql .= "UPDATE product_description SET name = REPLACE(name, '$ExistingWord3', '$ReplacerWord3') WHERE name LIKE '%$SearchWord3%';";

更新现在您只需调试查询并以任何优先方式编写代码。例如:

 $sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord1', '$ReplacerWord1') WHERE name LIKE '%$SearchWord1%';";
if ($conn->query($sql) === TRUE) {
    echo "1. Products updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}
    $sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord2', '$ReplacerWord2') WHERE name LIKE '%$SearchWord2%';";
if ($conn->query($sql) === TRUE) {
    echo "2. Products updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

    $sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord3', '$ReplacerWord3') WHERE name LIKE '%$SearchWord3%';";

if ($conn->query($sql) === TRUE) {
    echo "3. Products updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

答案 2 :(得分:0)

我不知道这是否是正确的方法,但在阅读你们的评论主要是@Alex的评论

我将变量更改为

$sql = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord1', '$ReplacerWord1') WHERE name LIKE '%$SearchWord1%';";
$A = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord2', '$ReplacerWord2') WHERE name LIKE '%$SearchWord2%';";
$B = "UPDATE product_description SET name = REPLACE(name, '$ExistingWord3', '$ReplacerWord3') WHERE name LIKE '%$SearchWord3%';";

并添加了

if ($conn->query($sql) === TRUE) {
    echo "Everything worked as planned";
} else {
    echo "Error updating record: " . $conn->error;
}
if ($conn->query($A) === TRUE) {

} else {
    echo "Error updating record: " . $conn->error;
}
if ($conn->query($B) === TRUE) {

} else {
    echo "Error updating record: " . $conn->error;
}