2016-06-21 29 views
1

我寫迭代的PHP文件通過我的所有服務器上的數據庫,並取代條目的整列(或兩個)四****保護敏感信息的迭代。不過,我有下面的代碼在SQL語法返回一個解析錯誤,我現在用:語法錯誤在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

無法選擇數據庫:你的SQL語法有錯誤;檢查對應於你的MySQL服務器版本的在線使用近「」正確的語法手冊1

我覺得這個錯誤發生,因爲當我通過我的數據庫循環作爲一個數組,由於某種原因,之後的條目是空白的。不完全確定這是爲什麼。當我在Sequel Pro中嘗試SHOW DATABASES;查詢時,它會返回正確的數據庫列表。這是列表的例子:

  1. INFORMATION_SCHEMA
  2. MySQL的
  3. performance_schema
  4. DB1
  5. DB2
  6. DB3
  7. 等....

我PHP解釋器和MySQL服務器版本sion都是5.6

+0

您對'mysqli_fetch_array()'的單個調用只返回第一行。你應該把這個像一個正常的查詢和調用'mysqli_fetch_array()''一環while'而不是用'計數的'for'循環內()'。 –

+0

你的意思'而($ d = mysqli_fetch_array($水庫))'? – Jodo1992

+1

是,然後'$分貝= $ d [ '數據庫'];'因爲'SHOW DATABASES'查詢返回稱爲'Database'單個列。它的行爲與普通的'SELECT'語句相同,返回1列和N行。 –

回答

1

MySQL將特殊查詢SHOW DATABASES與查詢的常規SELECT基本相同的方式發送給查詢客戶端,因此您的應用程序代碼可以完全按照您處理的方式處理它一個常規的SELECT聲明。

SHOW DATABASES查詢返回一個名爲Database的列和每個數據庫的一行。

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

因此而不是for循環利用count()mysqli_fetch_array()單一的通話,使用你會在SELECT查詢中使用相同的while循環結構,並用它分配$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... 
}