【问题标题】:PHP Form Post to MySQL database errorPHP 表单发布到 MySQL 数据库错误
【发布时间】:2014-01-08 23:44:28
【问题描述】:

我的网站上有一个工作表单,它成功地将字段插入到 MySQL 数据库表中。我添加了一个新表,基本上复制了新表单的现有代码,但出现错误。我已经对它进行了很多调整,感到困惑。

这是表格:

    <form action="contact.php" method="post">
    <input type="hidden" name="submitted" value="true" />

<fieldset>
    <label>First Name: <input type="text" name="firstname" required="" /> </label><br />
    <label>Last Name: <input type="text" name="lastname" required /> </label><br />
    <label>Email Address: <input type="text" name="email" required /> </label><br />
    <label>Anniversary Date: <input type="date" name="weddingdate" /> </label><br />
    <label>Birthday: <input type="date" name="birthday"  /> </label><br />
    <label>Business Name: <input type="text" name="business" /> </label><br />
    <label>Are You A Chamber Member?: <input type="radio" name="chamber" value="memyes">Yes   <input type="radio" name="chamber" value="memno"> No<br />
    <label>Comments: <input type="textarea" name="comments" rows="2" cols="50"> </label>
</fieldset>
<input type="submit" value="Enter Me In The Contest!" />
</form>

contact.php 文件如下所示:

    if (isset($_POST['submitted'])) {
include('dbconnect.php');

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$weddingdate = $_POST['weddingdate'];
$birthday = $_POST['birthday'];
$business = $_POST['business'];
$chamber = $_POST['chamber'];
$comments = $_POST['comments'];

$sqlinsert = "INSERT INTO contest (`firstname`, `lastname`, `email`, `weddingdate`, `birthday`,`business`, 'chamber', 'comments') VALUES ('$firstname', '$lastname', '$email', '$weddingdate', '$birthday', '$business', '$chamber', '$comments')";

if (!mysqli_query($dbcon, $sqlinsert)) {
    die('Error adding to database');    
}
header('Location: website omitted');
}

我知道它连接正确,我为两者使用相同的连接脚本,并添加了连接回显消息对连接进行了测试。

我使用这个脚本得到的只是“添加到数据库时出错”消息...

提前感谢您的建议和帮助!

【问题讨论】:

  • @skrilled,而不是 snark,尝试教育用户他做错了什么。
  • @castis 我希望我能多次点赞评论。我真的不喜欢“我是编程之神,所有知道得更少的人都应该得到更糟”的人
  • mysqli_error 告诉你什么?
  • castis:我已经厌倦了在这个网站上每 5 分钟输入一次“清理您的数据库输入”。我们是否假设 OP 不知道如何谷歌?小鲍比桌 = 谷歌上的第一个结果。
  • 另外,您引用了您的两个 (INSERT into) 列 'chamber', 'comments',这应该是反引号,就像您为其他列所做的一样。

标签: php mysql forms


【解决方案1】:

您的两个 INSERT 列(chambercomments)使用单引号而不是反引号。

(.......`weddingdate`, `birthday`,`business`, 'chamber', 'comments')
                                              ^       ^  ^        ^

您目前用于输入的方法是不安全的,因此已通过合并mysqli_real_escape_string() 函数来取代。

$firstname = $_POST['firstname'];推荐)

$firstname= mysqli_real_escape_string($dbcon, $_POST['firstname']);(推荐)

注意:使用隐藏字段来检查它是否是 isset 并不总是一个好主意 - 您可能会在不检查空字段的情况下获取空数据,而您没有这样做.

您可以命名您的提交按钮并使用(isset($_POST['submit']))

例如:

<input type="submit" name="submit" value="Enter Me In The Contest!" />

然而,这完全取决于你。

PHP

if (isset($_POST['submitted'])) {
include('dbconnect.php');

$firstname= mysqli_real_escape_string($dbcon, $_POST['firstname']);
$lastname= mysqli_real_escape_string($dbcon, $_POST['lastname']);
$email= mysqli_real_escape_string($dbcon, $_POST['email']);
$weddingdate= mysqli_real_escape_string($dbcon, $_POST['weddingdate']);
$birthday= mysqli_real_escape_string($dbcon, $_POST['birthday']);
$business= mysqli_real_escape_string($dbcon, $_POST['business']);
$chamber= mysqli_real_escape_string($dbcon, $_POST['chamber']);
$comments= mysqli_real_escape_string($dbcon, $_POST['comments']);


$sqlinsert = "INSERT INTO `contest` (`firstname`, `lastname`, `email`, `weddingdate`, `birthday`,`business`, `chamber`, `comments`) VALUES ('$firstname', '$lastname', '$email', '$weddingdate', '$birthday', '$business', '$chamber', '$comments')";

if (!mysqli_query($dbcon, $sqlinsert)) {
    die('Error adding to database');    
}
header('Location: website omitted');
}

【讨论】:

  • 感谢您的快速教育。这绝对是让我搞砸的倒计时。我还是 PHP 方面的新手,感谢对我的代码的额外帮助。出于上述安全原因,我已成功使用此脚本并正在调整我当前使用的其他 PHP 表单连接脚本以匹配它。
  • 我会投票赞成,但我对这个网站还不够新,目前还不能。
  • 不客气,很高兴我能同时帮助和传递教育。网络并不是许多人认为的友好的地方,我们需要保护自己。 @MarcT
【解决方案2】:

尝试从列名周围删除引号,如下所示:

$sqlinsert = "INSERT INTO contest (firstname, lastname, email, weddingdate, birthday,business, chamber, comments) VALUES ('$firstname', '$lastname', '$email', '$weddingdate', '$birthday', '$business', '$chamber', '$comments')";

【讨论】:

  • 最好在列名周围保留反引号。仅供参考:我不是投反对票的类型,以防万一有人对你这样做。我自己当然不喜欢它,但是嘿……它们只是分数,它们不是真实的。如果您坚持自己的信念,那就顺其自然吧 ;-) 干杯 --- 从理论上讲,您是正确的,但同样...反引号是最好的,原因有很多。
  • 嘿没问题。这就是为什么我说“尝试”:) 我想我应该在回答之前做更多的研究。经验教训:)
  • 我喜欢“分享财富”。 ;-)
  • 几个月前我不知道比下一个人更好,所以我很高兴分享我所知道的已经“尝试、测试和真实” ,我在这里学到了大部分内容。请注意,Google 是不可或缺的工具。
  • 理论上,我的回答可能仍然可以解决问题,因为在业务和腔室列上没有使用反引号。也许吧。
【解决方案3】:

首先,我想对您说一点警告:您的脚本正在尖叫“我愿意接受 SQL 注入”。你根本没有保护。

始终至少使用 addlashes....

---// 你的脚本(调整) //-----

    <?php

    if (isset($_POST['submitted'])) {
        include('dbconnect.php');

        $firstname = addslashes($_POST['firstname']);
        $lastname = addslashes($_POST['lastname']);
        $email = addslashes($_POST['email']);
        $weddingdate = addslashes($_POST['weddingdate']);
        $birthday = addslashes($_POST['birthday']);
        $business = addslashes($_POST['business']);
        $chamber = addslashes($_POST['chamber']);
        $comments = addslashes($_POST['comments']);

        $sqlinsert = "INSERT INTO contest (firstname, lastname, email, weddingdate,
 birthday, business, chamber, comments) VALUES 
('".$firstname."', '".$lastname."', '".$email."', '".$weddingdate."', 
                    '".$birthday."', '".$business."', '".$chamber."', '".$comments."')";


            if(mysqli_query($dbcon, $sqlinsert)){

                echo "Query &nbsp;done :-)<br>";
            } else {
                echo mysqli_error($dbcon) . "<hr>";
            }

        }

---// 你的脚本(调整) //-----

当然,你也可以使用 mysqli_real_escape_string 来代替 addlashes:

<?php
$query = mysqli_real_escape_string($dbcon,$sqlinsert);

无论如何,如果您运行此脚本并遇到 MySQL 错误,那么该脚本将向您的屏幕发送一条错误消息。你可以从那里拿走它;-)

附:由于您在查询中定义字段的方式,您的脚本无法正常工作:您在字段名称中一起使用:business 和 'chamber'....

【讨论】:

    【解决方案4】:

    感谢您的快速教育。绝对是让我搞砸的倒计时。我还是 PHP 方面的新手,感谢对我的代码的额外帮助。出于上述安全原因,我已成功使用此脚本并正在调整我当前使用的其他 PHP 表单连接脚本以匹配它。

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      相关资源
      最近更新 更多