2016-06-21 7 views
1

私のデータベースのすべてをサーバー上で反復処理し、重要な情報を保護するために1列または2つのエントリを4つの****に置き換える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

は選択できませんでしたdatabase:SQL構文にエラーがあります。ラインで「」の近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください1

私は配列として私のデータベースをループしていたときので、このエラーは何らかの理由で、発生していると思いますその後のエントリは空白です。これがなぜなのか完全にはわかりません。 Sequel ProでSHOW DATABASES;クエリを試すと、データベースの適切なリストが返されます。これは、そのリストの例である:

  1. INFORMATION_SCHEMA
  2. mysqlの
  3. performance_schema
  4. DB1
  5. DB2
  6. DB3など
  7. ....

マイPHPインタプリタとMySQLサーバ版両方とも5.6

+0

あなたがmysqli_fetch_array()を呼び出すと、最初の行だけが返されます。これを通常のクエリのように扱い、 'for'ループの代わりに' while'ループの中で 'count()'を使って 'mysqli_fetch_array()'を呼び出す必要があります。 –

+0

あなたは 'while($ d = mysqli_fetch_array($ res))'を意味しますか? – Jodo1992

+1

はい、 '$ db = $ d ['Database'];' SHOW DATABASES'クエリが 'Database'という単一の列を返すためです。これは、通常のSELECT文と同じように動作し、1列とN行を返します。 –

答えて

1

SHOW DATABASESは、クエリクライアントにどのように送信されるのかについて、MySQLは通常のSELECTクエリと同じであるため、アプリケーションコードは扱うのとまったく同じ方法で扱うことができます通常のSELECTステートメント

SHOW DATABASESクエリは、Databaseという1つの列と各データベースの行を返します。

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

だから代わりにcount()を利用forループと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... 
} 
関連する問題