0

48 行の Excel ファイルからテキスト (UTF-8 エンコード) を MySQL テーブルに挿入しようとしています。38 行のみが挿入されます。一部の行には、"/"、"?"、":"、","、"."、"()"、"'"、"""、"!" などの特殊文字が含まれています。

foreach ($ret as $rec) {
    if($count == 0) {
        $count++;
        continue;
    }

    $insert = "INSERT INTO chall (description, time, coin, mode, kids, teens, adults, theme_id, type_id) VALUES ('{$rec['A']}', '{$rec['B']}', '{$rec['C']}', '{$rec['D']}', '{$rec['E']}', '{$rec['F']}', '{$rec['G']}', '{$_REQUEST['theme_id']}', 1)";
    $ins_query = mysql_query($insert) or mysql_error();
    if(0)
    {
        die("Error! Can Not Upload Data...");
    }
}

以下は、db に正常に挿入されたテキストの例 です。ニュース。これは一例です。次の質問に対する簡単な答えを 2 人に尋ねてください。

以下は、データベースに挿入されなかった例です: Zig-a-zig-ah! つぼみのグループを集めて、このテストを再現し、公共の場でスパイス ガールズのビデオをリメイクしてもらいます。見知らぬ人にも参加してもらいましょう!

私はできる限り調査しましたが、答えは見つかりませんでした。10 行が db テーブルに挿入されていません。不足しているものはありますか?助けてくれてありがとう。

4

2 に答える 2

0

これは正しくありません:

$ins_query=  mysql_query($insert) or mysql_error();
                                   ^^^^^^^^^^^^^^

mysql_error()文字列を返します。つまり、mysql_query()失敗した場合 (そして boolean を返す場合false、エラー文字列を に割り当てます$ins_query。つまり$ins_string、ブール値の false になることはありません。これは、失敗を検出するためにテストする必要があるものです。

その後

if(0)

常に false と評価され、dieとにかく実行しないため、エラーがいつ発生したかを検出する方法はありません。

あなたが持っている必要があります

 $result = mysql_query(...);
 if($result === false) {
     die(mysql_error());
 }

また、 SQL インジェクション攻撃に対して脆弱であることに注意してください。

于 2016-08-04T14:02:28.763 に答える
0

@Marcが推奨するように、mysql_errorを修正する必要があります

また、fgetcsv関数を使用してファイルを解析し、各行に適切な数のフィールドがあるかどうかを確認する必要があります。

このため

$_REQUEST['theme_id']

悪意のあるユーザーは、クエリに必要なものを何でも挿入できます (SQL インジェクション)。

ユーザーの送信内容を信用しない

于 2016-08-04T14:12:00.793 に答える