0

我对此很陌生,这是我决定加倍努力的大学项目的一部分。

我创建了一个 HTML 表单来将行插入到 MYSQL 数据库的表中。当输入有限数量的字符时,表单工作正常,但是当我尝试超过一定数量时,我得到一个错误。我对所有列都使用了 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')";

您可以使用任何“转义”(确保安全)您输入查询的值的方法来解决此问题。实际上有一百种方法可以做到这一点,如果你被要求使用 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 ('An Adventure's Dream')”,请注意 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 回答