-1

API からデータをループして、これらの値を MySQL データベースに投稿しようとしています。

このようなもの:

$values = json_decode(file_get_contents("my-json-file"));

$SQL = new mysqli(SQL_HOST, SQL_USER, SQL_PASS, DB_NAME);
$SQL->autocommit(FALSE);

foreach($values As $item)
{
    $query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";)";
    $SQL->query($query);
    if(!$SQL->commit())
    {
        echo "ERROR ON INSERT: [" . $query . "]<hr/>";
    }
}
$SQL->close();

ループが速すぎるため、SQL が追いつきません。(ええ!)次に、次のようなものが必要になります。

foreach($values As $item)
{
    /**** STOP/PAUSE LOOP ****/

    $query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";");
    $SQL->query($query);
    if($SQL->commit())
    {
        /**** START THE LOOP AGAIN ****/
    }
    else
    {
        echo "ERROR ON INSERT: [" . $query . "]<hr/>";
    }
}

または、これを正しい方法で行うにはどうすればよいですか?

編集:毎回ランダムな投稿を挿入します。

編集 2: これは単なるサンプル コードです。はい、ここではセミコロンが間違っていますが、非常に多くのコメントがあるため、変更しません。これは実際の問題ではありませんでした。別のサーバーで実行しようとしましたが、そこで動作しました。この問題は、MAMP を再起動することで修正されました。

4

4 に答える 4

2

まず、ループの実行速度が速すぎてMySQLが追いつかないというあなたの考えは、完全に間違っています。呼び出しは、MySQLが応答を返すの$SQL->query()を待ってから続行するため、MySQLが応答するよりも速くループが実行されることはありません。

次に、実際の問題について説明します。クエリ:

$query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2.";)";

最後にセミコロンがあり、その後value2は無効になります。そこに引用符を入力するつもりだったと思いますか?セミコロンを使用すると、すべてのクエリが失敗し、エラーがスローされます。

これが問題の原因である可能性がありますが、チェックイン中にエラーが発生していないため、わかりません。クエリを呼び出した後、コードにエラーチェックを追加します。クエリが正しい場合でも、エラーが発生する可能性があるため、コードでエラーをチェックする必要があります。このマニュアルページの例を参照してください:http ://www.php.net/manual/en/mysqli-stmt.error.php

最後に、mysqli APIを使用しているので、プリペアドステートメントを使用した場合、コードははるかに優れており、おそらくより安全であることに言及する価値があります。こちらのPHPマニュアルの例を参照してください:http ://www.php.net/manual/en/mysqli-stmt.bind-param.php

[編集]

クエリが失敗するもう1つの考えられる理由は、入力値をエスケープしていないことです。入力値のいずれかに引用文字(またはSQLで無効なその他の文字)が含まれている場合、クエリは失敗します。さらに、この問題により、コードはSQLインジェクションハッキング攻撃に対して脆弱になります。

ORを使用して入力をエスケープするに$SQL->real_escape_string()は、クエリを変更して、準備されたステートメントを使用するようにします(上記で推奨されているように)。

于 2013-02-07T14:27:34.243 に答える
1

クエリはループ内にあります。つまり、ループはクエリの実行が終了するまで待機してから続行します。php コードは順番に処理されます...

于 2013-02-07T14:10:35.150 に答える
0

多くの回答とコメントが言うように、SQL が完了するまで続行しません。問題は、ローカルの apache/mysql サーバーにありました。再起動で治りました。はい、バカ投稿です。

于 2013-02-07T14:40:56.537 に答える
0

@phpalixが言ったように、PHPは順番に進み、前のアクションが完了するのを待ちます。

SQLが間違っていると思います。INSERT を次のように置き換えてみてください。

$query = "INSERT INTO my_table VALUES ('".$item->value1."', '".$item->value2."');";

また、セキュリティ対策のために、変数ごとに少なくともmysql_real_escape_stringを実行することを忘れないでください。

于 2013-02-07T14:29:57.690 に答える