0

自宅のコンピューターから離れることのない Web サイトの 2 つのページを介して、フォームを使用して、同じくコンピューターでホストされている MySQL データベースに項目を入力したいと考えています。以前にほぼ同じものでこれを行ったことがありますが、何らかの理由でこれは機能しません。自分のコンピューターから離れることはないので、これやそのようなもののセキュリティについては心配していません。実際に機能することを望んでいます。

形:

<form action='addclothes.php' method='post'><table style="font-family:verdana;font-size:14px;color:#004766;"><tr><td>
Type of clothing:</td><td><select name="type">
<option value="0">---</option>
<option value="dresses">Dress</option>
<option value="tops">Top</option>
<option value="bottoms">Bottom</option>
<option value="shoes">Shoes</option>
<option value="accessories">Accessory</option></select></td></tr>
<tr><td>Name:</td><td><input type="text" name="name"></td></tr>
<tr><td>Path to full image:</td><td><input type="text" name="largeimagepath"></td></tr>
<tr><td>Path to thumbnail:</td><td><input type="text" name="smallimagepath"></td></tr>
<tr><td colspan="2"><center><input type="submit" value="Submit" name="submit"></center></td></tr>
</table></form>

これは addclothes.php に送信され、同じレイアウトを維持するために html で囲まれた次のようになります。

<?php

$name = $_POST['name'];
$table = $_POST['type'];
$largepath = $_POST['largeimagepath'];
$thumbpath = $_POST['smallimagepath'];

    $db = mysql_connect("localhost", "root", "******") or die(mysql_error());
    mysql_select_db("Default") or die(mysql_error());

    $query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath)
 VALUES("{$name}", "{$largepath}", "{$thumbpath}")";
    mysql_query($query) or die(mysql_error()); ?>

<p>Item Added!</p>

次のページに来て、何をしても「アイテムが追加されました」とだけ表示されます。変数を作成した直後にクエリをエコーし​​ようとすると、どちらも表示されません。

4

2 に答える 2

1

これは間違っています:

$query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath)
            VALUES("{$name}", "{$largepath}", "{$thumbpath}")";

クエリを壊さないように、クエリ内で一重引用符を使用する必要があります (テーブル名を引用しないでください。mysql で予約語にすることができる場合は、そのためにバッククォートを使用します)。

$query = "INSERT INTO clothes.`{$table}` (name, imagepath, thumbimagepath)
            VALUES('{$name}', '{$largepath}', '{$thumbpath}')";

また、セキュリティ/SQL インジェクションは、悪意のある人々からあなたを保護するだけではないことに注意してください。'SQL クエリで使用できるようにデータを適切に準備しないと、自分で入力した有効なデータであっても、たとえば名前に文字が含まれていると (O'Neillたとえば...) 、クエリ/アプリケーションが壊れる可能性があります。

したがって、安全性は常に重要であり、PDO (または mysqli) と準備済みステートメントに切り替える必要があるのはそのためです。それとは別に、mysql_*関数は非推奨です。

最後のコメント: サイトを外部に公開する必要がある場合、準備やエスケープを行ってもクエリ内のテーブル名は保護されません。SQL インジェクションを避けるために、許可されたテーブル名のリストと照合する必要があります。

于 2013-03-21T14:03:47.167 に答える