0

変数を mysql データベースに出力する関数を開発しました。

SQLに値を記録するときに最初の値をスキップすることを除いて、うまく機能しているようです。ただし、コマンドでは 3 つすべてが表示されechoます。つまり、値 1 2 および 3 は echo で出力されますが、データベースに入るのは 2 と 3 だけです!

$xml = simplexml_load_file($url);

$allcharacters = $xml->xpath('///result/rowset/row/@name');

foreach($allcharacters as $alts) {
    $con=mysqli_connect("localhost","user","password","master");
    $sql="INSERT INTO masterlist (charactername) VALUES ('$alts')";
    mysqli_query($con,$sql);
    echo "Found $alts<br />";

挿入されるサンプル データ:

Found Tiamat's Shadow
Found Troyd23
Found Gore Innovater
Gore Innovater

助言がありますか?

4

1 に答える 1

0

入力をデータベースに挿入するときに、入力をサニタイズしていません。

'最初の項目の は、Found Tiamat's ShadowSQL クエリを中断するため、実際には挿入に失敗します。これは、「最初の値をスキップする」という質問の問題によって確認されます。

MySQLiでは、これを修正するための 2 つのオプションがあります。

1 つ目は、次を使用してデータをエスケープできることですmysqli_real_escape_string()

$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
    $alts = mysqli_real_escape_string($con, $alts);
    $sql="INSERT INTO masterlist (charactername) VALUES ('" . $alts . "')";
    ...

この関数を使用すると、データベースに挿入するときに「安全でない」文字が自動的にエスケープされます。

2 番目の方法は、準備済みステートメントを使用することです。これにはもう少しコードが必要になりますが、これを行うと、ほとんどの場合、誤って実行するのを忘れないことが保証されます。準備されたステートメントのサンプルを次に示します。

$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
    $stmt = mysqli_prepare($con, "INSERT INTO masterlist (charactername) VALUES ( ? )");
    mysqli_stmt_bind_param($stmt, "s", $alts);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    ...

この方法は、列のデータ型に基づいてデータをエスケープするため、前の方法よりもはるかに堅牢です。特定のユースケースに必要なものよりも少し多いかもしれませんが、準備されたステートメントを使用する習慣を身につけることは決して悪いことではありません =]

于 2013-03-19T02:39:14.797 に答える