gpt4 book ai didi

php - 遍历数据库时 SQL 查询中的语法错误

转载 作者:搜寻专家 更新时间:2023-10-30 23:38:42 24 4
gpt4 key购买 nike

我正在编写一个 PHP 文件,它遍历我在服务器上的所有数据库,并将一整列(或两列)条目替换为四个 **** 以保护敏感信息。但是,我在下面的代码在我使用的 SQL 语法中返回了一个解析错误:

<?php
/**
* This replaces an entire column within a table with a 4 asterisk long string
*/

$host = 'example.example.com';
$user = 'example';
$password = 'password';

$connection = new mysqli($host, $user, $password);

if (!$connection){
die ('Could not connect to server: '.mysqli_error($connection));
}

// Get the databases as an array
$res = mysqli_query($connection, "SHOW DATABASES");
$d = mysqli_fetch_array($res);

// Loop through the array of databases
for ($i = 0; $i < count($d); $i++){

$db = $d[$i];
echo "$db\n";

// To skip the first database information_schema
if ($i > 0){
$sql1 = /** @lang text */
"USE $db";
$query1 = mysqli_query($connection, $sql1);

if (!$query1){
die('Could not select database: '.mysqli_error($connection));
}

$sql2 = /** @lang text */
"SELECT * FROM `info`";

$query2 = mysqli_query($connection, $sql2);

if (!$query2){
die('Could not select from `info`: '.mysqli_error($connection));
}

while ($row = mysqli_fetch_array($query2)){

$id = $row['id'];

$sql3 = /** @lang text */
"IF COL_LENGTH('info','borrower') IS NOT NULL
BEGIN
UPDATE `info`
SET `borrower` = '****'
WHERE `id` = '$id'
END";

$query3 = mysqli_query($connection, $sql3);

if (!$query3){
die('Could not replace number with "****" '.mysqli_error($connection));
}

$sql4 = /** @lang text */
"IF COL_LENGTH('info','coborrower') IS NOT NULL
BEGIN
UPDATE `info`
SET `coborrower` = '****'
WHERE `id` = '$id'
END";

$query4 = mysqli_query($connection, $sql4);

if (!$query4){
die('Could not replace number with "****" '.mysqli_error($connection));
}
}
}

mysqli_close($connection);
?>

这是我返回的错误信息:

information_schema

Could not select database: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ' at line 1

我认为发生此错误是因为当我将数据库作为数组循环时,出于某种原因,之后的条目是空白的。不完全确定这是为什么。当我在 Sequel Pro 中尝试 SHOW DATABASES; 查询时,它会返回正确的数据库列表。这是该列表的示例:

  1. 信息架构
  2. 数据库
  3. 性能模式
  4. db1
  5. db2
  6. db3
  7. 等....

我的PHP解释器和MySQL Server版本都是5.6

最佳答案

MySQL 将特殊查询 SHOW DATABASES 处理为与常规 SELECT 查询基本相同的查询,就如何将其发送到查询客户端而言,因此您的应用程序代码可以对待它的方式与处理常规 SELECT 语句的方式完全相同。

SHOW DATABASES 查询返回一个名为 Database 的列和每个数据库的一行。

> show databases;
+-------------------------+
| Database |
+-------------------------+
| information_schema |
| db1 |
| db2 |
+-------------------------+
3 rows in set (0.00 sec)

因此,不是使用 count()for 循环和对 mysqli_fetch_array() 的单个调用,而是使用相同的 while 您将在 SELECT 查询中使用的循环结构,并为其分配 $db

$res = mysqli_query($connection, "SHOW DATABASES");
if (!$res) {
// handle error...
}
// On query success, fetch in a normal loop
while ($d = mysqli_fetch_assoc($res)) {
// Database name is in the column `Database`
$db = $d['Database'];

// Advisable to quote it with backticks...
$sql1 = "USE `$db`";
// etc...
}

关于php - 遍历数据库时 SQL 查询中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37948708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com