0

MySQLでPHPフォームを作成しようとしています。問題は、フィールドに長いテキストを追加しようとすると、毎回エラーが発生することです。

エラー

SQL構文にエラーがあります。1行目のnear.....で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

クエリを生成するPHPコードは次のとおりです。

<?php

if ( $_GET['aktion'] == "speichern" )
{
    $title          = $_GET['title'];
    $description    = $_GET['description'];
    $applepart      = $_GET['applepart'];
    $partnumber     = $_GET['partnumber'];
    $productcode    = $_GET['productcode'];
    $compatibility  = $_GET['compatibility'];
    $url_bild       = $_GET['url_bild'];
    $price          = $_GET['price'];

    $sql  = "INSERT INTO adressbuch ";
    $sql .= " SET ";
    $sql .= " title         = '$title', ";
    $sql .= " description   = '$description', ";
    $sql .= " applepart     = '$applepart', ";
    $sql .= " partnumber    = '$partnumber', ";
    $sql .= " productcode   = '$productcode', ";
    $sql .= " compatibility = '$compatibility', ";
    $sql .= " url_bild      = '$url_bild', ";
    $sql .= " price         = '$price' ";

    require_once ('konfiguration.php');
    $db_erg = mysql_query($sql)
        or die("Anfrage fehlgeschlagen: " . mysql_error());

    echo '<h1>Adresse wurde speichert</h1>';
    echo '<a href="auflistung.php">Auflistung anzeigen</a>';
    exit;
}
?>

<form name="" action="" method="GET" enctype="text/html">
<p>Title:<br />
<input type="text" name="title" value="" size="60" />
</p>
<p>description:<br />
<input type="text" name="description" value="" size="60" />
</p>
<p>applepart:<br />
<input type="text" name="applepart" value="" size="60" />
</p>
<p>partnumber:<br />
<input type="text" name="partnumber" value="" size="60" />
</p>
<p>productcode:<br />
<input type="text" name="productcode" value="" size="60" />
</p>
<p>compatibility:<br />
<input type="text" name="compatibility" value="" size="60" />
</p>
<p>Bild:<br />
<input type="text" name="url_bild" value="" size="60" />
</p>
<p>price:<br />
<input type="text" name="price" value="" size="60" />
</p>

<input type="hidden" name="aktion" value="speichern" />

<input type="Submit" name="" value="speichern" />
</form>

ご協力いただきありがとうございます

4

4 に答える 4

2

あなたのコードはSQLインジェクションの影響を受けやすく、あなたの問題はその理由についてのヒントにすぎません。

私たちが常に使用するルールは、「ユーザーエージェントからのデータを絶対に信用しない」です(つまり、$ _GETまたは$_POST内のデータは、潜在的に問題があるか、さらに悪いと見なします)。少なくとも、mysqli_real_escape_stringまたはより堅牢なDBフレームワークを使用して、これらの値を常にエスケープする必要があります。

于 2012-07-07T00:56:57.180 に答える
0

問題は、十分な長さの入力がある場合、どこかに一重引用符または改行が含まれていることです。このようにユーザー入力を単純に連結して、機能することを期待することはできません。さらに悪いことに、SQLインジェクション攻撃に対しては広く開かれています。フレームワークを使用してSQLクエリを作成する正しい方法を見つけてください。

于 2012-07-07T00:55:46.867 に答える
0

SQLインジェクションの脆弱性に関係なく、MySQLが処理するには長すぎるクエリを送信しているようです。

いくつかの構成を変更することでこれを克服することができます。MySQLの構成ファイルでパラメーター「max_allowed_pa​​cket」を上げてみてください。例えば:

[mysqld]
max_allowed_packet = 64M

これにより、64MBに設定されます。つまり、発行できる最長の単一クエリは64MBであり、クエリから取得できる最長の単一行のサイズは64MBです。

于 2012-07-07T03:31:49.183 に答える
0
<?php
      require_once ('konfiguration.php');

      if(isset($_POST['title']))
      {
        $title = mysql_real_escape_string(htmlspecialchars($_POST['title']));
        $description = mysql_real_escape_string(htmlspecialchars($_POST['description']));
        $applepart = mysql_real_escape_string(htmlspecialchars($_POST['applepart']));
        $partnumber = mysql_real_escape_string(htmlspecialchars($_POST['partnumber']));
        $productcode = mysql_real_escape_string(htmlspecialchars($_POST['productcode']));
        $compatibility = mysql_real_escape_string(htmlspecialchars($_POST['compatibility']));
        $url_bild = mysql_real_escape_string(htmlspecialchars($_POST['url_bild']));
        $price = mysql_real_escape_string(htmlspecialchars($_POST['price']));
        $insert = mysql_query("INSERT INTO `adressbuch` (`title`,`description`,`applepart`,`partnumber`,`productcode`,`compatibility`,`url_bild`,`price`) VALUES ('$title','$description','$applepart','$partnumber','$productcode','$compatibility','$url_bild','$price')");
        if (!$insert)
        {
          die('Eintrag konnte nicht gespeichert werden: ' . mysql_error());
        }
      }

    ?>

    <form method="POST" action="?page= ">
      <span>Neuer G&auml;stebucheintrag verfassen:</span> <br />
      <span>Title</span><input type="text" name="title" /> <br />
      <span>Description</span><textarea cols="16" rows="5"  name="description"></textarea> <br />
      <span>Apple Part</span><input type="text" name="applepart" /> <br />
      <span>Part Number</span><input type="text" name="partnumber" /> <br />
      <span>Product Code</span><input type="text" name="productcode" /> <br />
      <span>Compatibility</span><input type="text" name="compatibility" /> <br />
      <span>Image</span><input type="text" name="url_bild" /> <br />
      <span>Price</span><input type="text" name="price" /> <br />
      <input type="submit" value="Speichern"/> <br />
    </form>
于 2012-07-07T13:15:08.163 に答える