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:
- information_schema
- mysql
- performance_schema
- db1
- db2
- db3
- etc ....
Meine PHP Interpreter und MySQL Server ver sion sind beide 5.6
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. –
meinst du 'while ($ d = mysqli_fetch_array ($ res))'? – Jodo1992
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. –