2016-06-21 6 views
1

Ich schreibe eine PHP-Datei, die alle meine Datenbanken auf einem Server durchläuft und eine ganze Spalte (oder zwei) Einträge mit vier **** ersetzt, um vertrauliche Informationen zu schützen. Allerdings ist der Code, den ich unten haben einen Parse-Fehler in der SQL-Syntax zurückkehrt, die ich verwende:Syntaxfehler in der SQL-Abfrage beim Iterieren durch Datenbanken

<?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); 
?> 

Dies ist die Fehlermeldung, die ich immer bin zurück:

information_schema

konnte nicht wählen Datenbank: Sie haben einen Fehler in Ihrer SQL-Syntax. Sie in der Bedienungsanleitung zu Ihrem MySQL-Server-Version für den richtigen Syntax entspricht verwenden in der Nähe von ‚‘ at line 1

Ich denke, dieser Fehler auftritt, weil, wenn ich durch meine Datenbanken als Array bin Looping, aus irgendeinem Grund der Einträge danach sind leer. Nicht ganz sicher, warum das so ist. Wenn ich die SHOW DATABASES; Abfrage in Sequel Pro versuche, gibt es die richtige Liste der Datenbanken zurück. Dies ist ein Beispiel für diese Liste:

  1. information_schema
  2. mysql
  3. performance_schema
  4. db1
  5. db2
  6. db3
  7. etc ....

Meine PHP Interpreter und MySQL Server ver sion sind beide 5.6

+0

Ihr einzelner Aufruf von mysqli_fetch_array() 'gibt nur die erste Zeile zurück. Sie sollten dies wie eine normale Abfrage behandeln und 'mysqli_fetch_array()' innerhalb einer 'while' Schleife anstelle der' for' Schleife mit 'count()' aufrufen. –

+0

meinst du 'while ($ d = mysqli_fetch_array ($ res))'? – Jodo1992

+1

Ja, dann '$ db = $ d ['Database'];' weil die 'SHOW DATABASES' Abfrage eine einzelne Spalte namens' Database' zurückgibt. Es verhält sich genauso wie eine normale SELECT-Anweisung und gibt 1 Spalte und N Zeilen zurück. –

Antwort

1

MySQL behandelt die spezielle Abfrage SHOW DATABASES im Grunde die gleiche wie eine normale SELECT Abfrage in Bezug auf wie es an den abfragenden Client gesendet wird, und Ihr Anwendungscode kann daher behandeln es genau so, wie Sie behandeln würde eine regelmäßige SELECT Aussage.

Die Abfrage SHOW DATABASES gibt eine Spalte namens Database und eine Zeile für jede Datenbank zurück.

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

Also statt der for Schleife count() und einem einzigen Aufruf zu mysqli_fetch_array() Verwendung, verwenden die gleiche Struktur while Schleife Sie in einer SELECT Abfrage verwenden würde, und weisen $db mit ihm.

$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... 
}