私のデータベースのすべてをサーバー上で反復処理し、重要な情報を保護するために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;
クエリを試すと、データベースの適切なリストが返されます。これは、そのリストの例である:
- INFORMATION_SCHEMA
- mysqlの
- performance_schema
- DB1
- DB2
- DB3など
- ....
マイPHPインタプリタとMySQLサーバ版両方とも5.6
あなたがmysqli_fetch_array()を呼び出すと、最初の行だけが返されます。これを通常のクエリのように扱い、 'for'ループの代わりに' while'ループの中で 'count()'を使って 'mysqli_fetch_array()'を呼び出す必要があります。 –
あなたは 'while($ d = mysqli_fetch_array($ res))'を意味しますか? – Jodo1992
はい、 '$ db = $ d ['Database'];' SHOW DATABASES'クエリが 'Database'という単一の列を返すためです。これは、通常のSELECT文と同じように動作し、1列とN行を返します。 –