MySQL更新集替换为PHP多个查询
我正在尝试运行3行代码,如下所示。我也尝试了W3PHP mysqli_multi_query()函数,但它给了我一个语法错误,只有第一行代码可以运行MySQL更新集替换为PHP多个查询,php,mysql,Php,Mysql,我正在尝试运行3行代码,如下所示。我也尝试了W3PHP mysqli_multi_query()函数,但它给了我一个语法错误,只有第一行代码可以运行ExistingWord1 我也读了一些关于这个的stackoverflow帖子,但我不明白 <?php include 'words.php'; include('../config.php'); $servername = DB_HOSTNAME; $username = DB_USERNAME; $password = DB_PASSWO
ExistingWord1
我也读了一些关于这个的stackoverflow帖子,但我不明白
<?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();
?>
谢谢大家的帮助
这篇文章中的每个人都很有帮助,我真的很感激。为什么不直接嵌套
替换函数,一下子完成呢
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%'
这只需要对表格进行一次扫描
但这种方法只有在不“交换”关键字并且没有冲突的情况下才“有效”。(例如,首先用“foo”替换“fee”,用“bar”替换“foo”…操作顺序很重要
注:
REPLACE
函数替换字符串,而不是单词。如果您计划对文本或注释运行此函数,这一点很重要
在SQL文本中包含潜在不安全值的代码易受SQL注入攻击
必须使用例如mysql\u real\u escape\u string
正确转义可能不安全的值
或者,首选模式是将准备好的语句与绑定占位符一起使用
启用多重查询为整个主机甚至nastier SQL注入提供了更多机会;使其能够滑入整个语句,如DROP TABLE
语句。在确定代码不易受攻击之前,不要启用多重查询
跟进
首选模式是使用带绑定占位符的预处理语句
我更喜欢通过一次扫描而不是三次扫描来进行替换。WHERE
子句中类似“%”的谓词是不可搜索的,无论如何它都将是一次完全扫描
(在prepare
和execute
调用周围添加适当的错误检查。对于PDO,我们将使用try/catch/finally块。)为什么不直接嵌套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%'
这只需要对表格进行一次扫描
但这种方法只有在不“交换”关键字并且没有冲突的情况下才“有效”(例如,首先用“foo”替换“fee”,用“bar”替换“foo”…操作的顺序很重要
注:
REPLACE
函数替换字符串,而不是单词。如果您计划对文本或注释运行此函数,这一点很重要
在SQL文本中包含潜在不安全值的代码易受SQL注入攻击
必须使用例如mysql\u real\u escape\u string
正确转义可能不安全的值
或者,首选模式是将准备好的语句与绑定占位符一起使用
启用多重查询为整个主机甚至nastier SQL注入提供了更多机会;使其能够滑入整个语句,如DROP TABLE
语句。在确定代码不易受攻击之前,不要启用多重查询
跟进
首选模式是使用带绑定占位符的预处理语句
我更喜欢通过一次扫描而不是三次扫描来进行替换。WHERE
子句中类似“%”的谓词是不可搜索的,无论如何它都将是一次完全扫描
(在prepare
和execute
调用周围添加适当的错误检查。对于PDO,我们将使用try/catch/finally块。)根据提供的片段,将只执行最后一个$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;
}
根据提供的片段,将只执行最后一个$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;
}
我不知道这是否是正确的方式,但在阅读你们的评论时,主要是@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;
}
我不知道这是否是正确的方式,但在阅读你们的评论时,主要是@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;
}
这里没有足够的内容让我们继续。您得到的错误是什么,与运行此相关的其他代码是什么?请发布完整的代码片段。在您发布的行中,没有mysql调用根据提供的片段,只会执行最后一个$sql
值,因为您重新定义了相同的变量3次,o只有存储在var$sql
中的最后一个值,这里没有足够的值供我们继续。您得到的错误是什么,与运行此代码相关的其他代码是什么?请发布完整的代码片段。在您发布的行中没有mysql调用根据提供的片段,只有最后一个$sql
值将被执行剪切,因为您对同一变量重新定义了3次,所以只有存储在var$sql
中的最后一个值(我这样做的地方)才会得到错误更新记录:您的sql语法有错误;请查看与您的MySQL服务器版本对应的手册,了解使用“UPDATE product\u description SET name=REPLACE”附近的正确语法(名称,“香蕉”,“t”牌雪茄)