0

私はこれに非常に慣れていません、そしてそれは私がさらに一歩進んで行くことに決めた大学のプロジェクトの一部です。

MYSQLデータベースのテーブルに行を挿入するためのHTMLフォームを作成しました。入力する文字数が限られている場合はフォームは正常に機能しますが、一定量を超えてみるとエラーになります。すべての列にVARCHARを使用していますが、それらの制限は、挿入しようとしているテキストよりもはるかに高くなっています。

これが私のコードです

<html>
 <body>
   <h1>Add new entries to Home and News page here</h1>

    <form action="insert.php" method="post">
        <br>Date: <input type="date" name="date"></br>
        <br>Title: <input type="text" name="title"></br>
        <br>Body:<input type="text" name="body" </br>
        <br>Media: <input type="text" name="media"></br>
        <br>ID: <input type="text" name="id"</br>
        <input type="submit">
   </form>

 </body>
</html>

とPHP

<?php
   $con=mysqli_connect("***","****","****","*****");  
    // Check connection
   if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }

   $sql = "INSERT INTO news (date, title, body, media, id)
           VALUES
           ('$_POST[date]','$_POST[title]','$_POST[body]','$_POST[media]','$_POST[id]')";

   if (!mysqli_query($con,$sql)) {
        die('Error ' . mysqli_error());
   }

    echo "1 record added";

   mysqli_close($con);
?>

正しい方向へのポイントをいただければ幸いです。

4

2 に答える 2

1

あなたが受け取っているエラーは何ですか?エラートラップが正しくない可能性があることに注意してください。次のことを試してください。

die ('Error: '.mysqli_error ($con));

ユーザーから送信されたデータをエスケープ(安全化)していないことに気付きました。たとえば、「タイトル」を次のように設定した場合:

This is my title, '; SQL INJECTION; '

私はあなたのコードを壊します:

INSERT INTO news (date, title, body, media, id)
VALUES
('date','This is my title, '; SQL INJECTION; '','body','media','id')";

これは、クエリに入力する値を「エスケープ」(安全にする)する任意の方法を使用して解決できます。これを行うには文字通り100の方法があります。mysqi_*()関数を要求された場合は、次のように行うことができます。

$date = mysqli_real_escape_string ($con, $_POST['date']);
$title = mysqli_real_escape_string ($con, $_POST['title']);
$body = mysqli_real_escape_string ($con, $_POST['body']);
$media = mysqli_real_escape_string ($con, $_POST['media']);
$id = mysqli_real_escape_string ($con, $_POST['id']);

$sql = "INSERT INTO news (date, title, body, media, id)
       VALUES
       ('$date','$title','$body','$media','$id')";

だから何が起こっているのかについての説明: ( XKCDは主題について素晴らしい冗談を言っています。

mysqli_real_escape_stringがないと、ユーザーがフォームを介して投稿するものを使用してSQLクエリ($ sql)を構築することになります。SQLステートメントを変更してしまうことがなければ、それはすべて問題なく、ダンディです。

したがって、一重引用符を挿入すると、SQLは無効になります。たとえば、「VALUES('$ title')」は「VALUES('冒険の夢')」になる可能性があるため、MySQLがどのように表示されるかに注意してください。価値としての「冒険」、そして最後に壊れたものとしての「夢」?

「mysqli_real_escape_string()」を含めると、悪い記号(一重引用符など)がエスケープされます。これは、MySQLの場合、その前に「\」を追加することを意味します。これにより、MySQLはシンボルを無視し、SQLコマンドではなくデータとして扱うようになります。

デバッグを簡単にするために、次のように配置することをお勧めします。

 print "<pre>$sql</pre>";

$sqlを作成した直後。そうすれば、MySQLに何が送信されているかを正確に確認できます。

(個人的には、PHPのPDOライブラリを使用することを好みます。このライブラリに興味がある場合は、一読する価値があります。これには、ものをエスケープするためのいくつかの優れた機能があります:))

学位の勉強を楽しんでいただければ幸いです。

参考:VARCHAR(255)は、エラーを発生させることなく、データを255文字の長さにサイレントに切り刻む必要があります。

于 2013-03-15T10:49:38.163 に答える
0

これは、mysqlで入力するためです。たとえば、本文にはvarchar(255)が含まれます。これは、ニュースの本文には255文字しか含めることができないことを意味します。これにはスペースも含まれます。

より多くの文字を入力できるようにしたい場合は、たとえばvarchar(5000)という数字を大きくしてください。

于 2013-03-15T10:43:15.220 に答える