- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写一个 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;
查询时,它会返回正确的数据库列表。这是该列表的示例:
我的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/
我是一名优秀的程序员,十分优秀!