Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL更新集替换为PHP多个查询_Php_Mysql - Fatal编程技术网

MySQL更新集替换为PHP多个查询

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

我正在尝试运行3行代码,如下所示。我也尝试了W3PHP mysqli_multi_query()函数,但它给了我一个语法错误,只有第一行代码可以运行
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”牌雪茄)