我正在尝试运行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();
?>
感谢帮助人员
这篇文章中的每个人都非常有帮助我真的很喜欢它。
答案 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();
(在prepare
和execute
调用周围添加相应的错误检查。使用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;
}