使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库

Posted

技术标签:

【中文标题】使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库【英文标题】:Using PDO and PHP to insert data from form into MySQL database 【发布时间】:2016-06-03 00:07:31 【问题描述】:

我目前正在从我的表单“form.php”中获取数据并将其发送到“index.php”,在那里我使用 PDO 语句将这些值插入 mysql 数据库。在 MySQL 中,我设置了名字和姓氏不能为空的地方,因为数据将被提交回网站,其中名字 + 姓氏 = 全名,并且该全名会出现在支持者列表中。

我的问题是,

如果我不想将 MySQL 设置为接受 NULL 值,我应该在我的 PHP 中进行哪些更改以接受来自表单的值并将其提交到带有附加到该特定用户实例的值的数据库?我尝试了 php.net/docs 和其他 *** 问题并没有完全解决我的挑战,非常感谢任何帮助

FORM.PHP

<form action="../index.php" method="post">
      <fieldset class="form-group">
      <label for="firstname">First Name</label>
      <input type="text" name="firstname" class="form-control" id="firstname" placeholder="First Name">
    </fieldset>


    <fieldset class="form-group">
      <label for="lastname">Last Name</label>
      <input type="text" name="lastname" class="form-control" id="lastname" placeholder="Last Name">
    </fieldset>


        <fieldset class="form-group">
          <label for="exampleInputEmail1">Email address</label>
          <input type="text" name="email" class="form-control" id="email" placeholder="Enter email">
          <small class="text-muted">We'll never share your email with anyone else.</small>
      </fieldset>

      <button type="submit" id="form-button" class="btn btn-primary">Submit</button>

    </form>

我将它发送到 index.php,这是我收到错误的地方!

“连接数据库时出错SQLSTATE[23000]:违反完整性约束:1048 列'firstname'不能为空”

这是我的 index.php 代码

$form = $_POST;
$id = $form['id'];
$firstname = $form['firstname'];
$lastname = $form['lastname'];
$email = $form['email'];


try 
$db = new PDO("mysql:host=" . DB_HOST. ";dbname=" .DB_NAME .";port=".DB_PORT,DB_USER,DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$add_supporter = $db->prepare("INSERT INTO supporters (id, firstname, lastname, email) 
                             VALUES (:id, :firstname, :lastname, :email)");

$add_supporter->bindParam(":id", $id);
$add_supporter->bindParam(":firstname", $firstname);
$add_supporter->bindParam(":lastname", $lastname);
$add_supporter->bindParam(":email", $email);
$add_supporter->execute();



 catch (Exception $e) 
echo "Error in connection to database" . $e->getMessage() . "</br>";
die();

【问题讨论】:

使用条件!empty() 或更改您的列以包含默认值。前者更好。 您应该验证该字段,因为它不应为空。 我不太确定你到底在问什么 我和@RiggsFolly 在一起。请澄清这一点:我应该在我的 PHP 中进行哪些更改以接受来自表单的值并将其提交到数据库,并将值附加到该特定用户的该实例? 类似于if (!isset($_POST['firstname'],$_POST['lastname'],$_POST['email'])) yourErrorHandlerHere(); btw:您的表单没有 id/name="id" 的输入控件;您可能希望将其从 sql 查询中完全删除,并让 mysql 自动处理该字段。 【参考方案1】:

如果您是 PHP 新手(或一般编程),这里有一个更好的提示,我可以针对这个(和类似的)问题给出:

您已经制定了问题陈述。这还不是(伪)代码,而是第一个重要步骤:

如果我验证“名字”和“姓氏”不为空,会是什么样子?

这个问题实际上包含解决方案:您将为这些值添加 validation。现在,您没有验证输入值,而是将它们直接传递到数据库查询中。在您当前的情况下,数据库会验证这些值。从您的问题中,我了解到您对该级别的验证没有信心。您可能会将已经用您自己的话完成的验证视为错误消息。但从技术上讲,数据库服务器正在保护数据库中的数据结构,这样定义为不输入的值就不会输入。

那么我可以给你的实际提示是什么?在编程中,当您有问题陈述(例如在进行数据库交互之前验证输入值)时,您只是假装您已经解决了问题。这样,您就可以将问题转移到您的问题的整个解决方案之外,并且只需编写软件的主要部分,就好像它已经在工作一样。这可以帮助您区分控制流问题和数据处理问题。例如,您的程序总是需要有经过验证的值才能工作,但代表经过验证的值可能会随着时间而改变。

因此,在您的代码中,所有与表单相关的数据都以数组的形式组合在 $form 变量中。这是您将 $form 变量映射到 SQL 查询参数的示例代码:

$id = $form['id'];
$firstname = $form['firstname'];
$lastname = $form['lastname'];
$email = $form['email'];

因此,在执行此类与数据库相关的操作之前,您可以例如确定该表单是否验证:

$formIsValid = validate_form($form);
if (false === $formIsValid) 
    // do what needs to be done with an invalid form
 elseif(true === $formIsValid) 
    // do what needs to be done with a valid form (database interaction)
 else 
    throw new UnexpectedValueException('Should never come here');

如果您验证表单数据,这就是您的代码可能的样子。但是,它仍然没有显示如何表单正在被验证。当然,您需要验证$form 的每个字段,因此您需要将其写下来(定义)表单验证。例如有些不应该为空,我为此使用isset 语句:

function validate_form(array $form) 

   if (!isset($form['firstname']) 
       return false;
   

   if (!isset($form['lastname']) 
       return false;
   

   return true;

我希望这可以为您提供继续编写脚本所需的指导。

【讨论】:

【参考方案2】:

正如我在 cmets 中所说,对您的 POST 数组使用条件 !empty()

if( !empty($_POST['var1']) || !empty($_POST['var2']))

// do something



else

// do something else


您可以将||- OR 更改为&amp;&amp; - AND

“然后将其提交到数据库,并将值附加到该特定用户的该实例?”

对于特定用户,使用WHERE 子句。

如果要查询特定用户,则需要使用 SELECT。

http://dev.mysql.com/doc/refman/5.7/en/select.html

对于所有数据操作语句,请咨询:

http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-data-manipulation.html

向特定用户发送邮件:

摘自此问答Send php mail to user if form submitted 并作为示例:

$results = $db->prepare("select $user_email from table where ID=$user_ID");

try

/*YOUR INSERT STATEMENT FROM ABOVE*/

$to=$results;
$subject="Whatever you want your subject to be";
$headers = "From: WHATEVER@WHATEVER.COM\r\n";
$headers .= "Reply-To: WHATEVER@WHATEVER.COM \r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

$message= "WHATEVER MESSAGE";
mail ($to , $subject , $message, $headers);
echo "Your message has been sent";

Catch($error)
Do whatever you want here. Add another mail function to let you know that  the post was not accepted, etc.

您也可以在 Stack 上查看此问答:

Select and send mail from my database

【讨论】:

Halelujiah Smokey! @RiggsFolly 每个人都在周末玩得很开心。 低悬的果实 喜欢“无证行医”? ;-) @VolkerK hehe 之类的。只要手术刀够钝,就会造成很多伤害;-)

以上是关于使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php pdo 中使用 1 个表单将数据插入到 2 个不同的表中?

JS数组到PHP并使用PDO更新MYSQL中的表

更新选择列表而不刷新 [PDO/PHP/AJAX]

如何使用准备好的语句将表单数据插入 PDO?

无法使用 php 的 PDO 将数据插入数据库

使用 php 和 pdo 插入的表单