使用 php 和 pdo 插入的表单
Posted
技术标签:
【中文标题】使用 php 和 pdo 插入的表单【英文标题】:form for inserting using php and pdo 【发布时间】:2013-05-09 04:27:51 【问题描述】:我对此失去了理智,我真的可以使用一些方向。只是试图与 php 一起学习 PDO,但无法理解逻辑。我一直试图在网上找到一些可以显示此测试尝试流程的很好示例的东西,但我真的很难。
是否有人,即使你不得不对我大发雷霆(尽管像任何人一样,我不希望你这样做),能给我一些指示,告诉我我做错了什么?我正在构建它以开始我的理解。有很多关于使用 mysqli 但不是 pdo 的信息,这让我发疯了。
提前致谢。代码如下:
<?php
# connection info to the db
$host = "--shadowed--";
$dbname = "--shadowed--";
$user = "--shadowed--";
$pass = "--shadowed--";
# pdo options/attributes
$opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); // not getting errors
# data source name
$dsn = "mysql:host=$host;dbname=$dbname";
# basic pdo connection (with added option for error handling)
if (isset($_POST['submit']))
try
$DBH = new PDO($dsn, $user, $pass, $opt);
$STH = $DBH->prepare("INSERT INTO data (name,email,phone,detail,cost) VALUES (:name,:email,:phone,:detail,:cost)");
$STH->bindParam(':name', $name);
$STH->bindParam(':email', $email);
$STH->bindParam(':phone', $phone);
$STH->bindParam(':detail', $detail);
$STH->bindParam(':cost', $cost);
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$detail = $_POST['detail'];
$cost = $_POST['cost'];
$STH->execute();
echo $STH; // attempted to echo back the data, but nothing happens
catch (PDOException $e)
echo $e->getMessage(); // no errors
echo '<form method="POST" action="">';
echo '<p>Enter the below information if you want to live:</p>';
echo 'Name: <input type="text" name="name"><br />';
echo 'E-mail: <input type="text" name="email"><br />';
echo 'Phone: <input type="text" name="phone"><br />';
echo 'Order will be generated randomly from class (once built)<br />';
echo 'Description: <input type="text" name="detail"><br />';
echo 'Cost: <input type="text" name="cost"><br />';
echo '<input type="submit" value="Do-It"></form>';
# close the connection
$DBH = null;
?>
------------- 达到分辨率后的最终代码 -------------
------------- 达到分辨率后的最终代码 -------------
(还是个新手,所以目前无法回答我自己的问题)
所以首先,我没有想出这个……这真的是这里所有人的混合体。在我尝试从我的知识中学习所有缺失的链接时,我感谢大家的帮助和时间。
主要问题似乎是,当我最初尝试使用if (isset($_POST['submit']))
时,它实际上并没有做或发送任何东西。没有错误......没有数据库问题......只是一堆什么都没有。我们删除了它,发现它阻碍了(ty @Fred)。虽然这并没有改变代码的工作方式,但使用@hjpotter92 建议变得更加高效。然后我们看看如何使用这个单页提交。我最终混合使用了@Fred 和@david strachan 的建议,因为两者都没有给我正确的反应,然后我添加了一个 if/else 语句来执行检查,如果它通过了,运行 try/catch。
这不是艺术品,但我学到了很多东西并感谢您的帮助。另外,我认为将一些东西放在那里人们可以碰到一个完整的例子会很好。如果你们中的任何人有任何其他建议,请告诉我。在学习基础知识的同时,我也在回顾如何帮助防止 sql 注入(本次测试可能没有完全涵盖)。
#------------------ Working Code ------------------#
# pdo options/attributes
$opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION );
# data source name
$dsn = "mysql:host=$host;dbname=$dbname";
# basic pdo connection (with added option for error handling)
if ($_SERVER['REQUEST_METHOD'] == "POST")
if (!$_POST['name'] || !$_POST['email'] || !$_POST['phone'] || !$_POST['detail'] || !$_POST['cost'])
echo "<p>Please supply all of the data! You may press your back button to attempt again minion!</p>";
exit;
else
try
$DBH = new PDO($dsn, $user, $pass, $opt);
$STH = $DBH->prepare("INSERT INTO data (name,email,phone,detail,cost) VALUES (:name,:email,:phone,:detail,:cost)");
$STH->bindParam(':name', $_POST['name']);
$STH->bindParam(':email', $_POST['email']);
$STH->bindParam(':phone', $_POST['phone']);
$STH->bindParam(':detail', $_POST['detail']);
$STH->bindParam(':cost', $_POST['cost']);
$STH->execute();
catch (PDOException $e)
echo $e->getMessage();
echo "<p>Data submitted successfully</p>";
echo '<form method="POST" action="">';
echo '<p>Enter the below information if you want to live:</p>';
echo 'Name: <input type="text" name="name"><br />';
echo 'E-mail: <input type="text" name="email"><br />';
echo 'Phone: <input type="text" name="phone"><br />';
echo 'Order will be generated randomly<br />';
echo 'Description: <input type="text" name="detail"><br />';
echo 'Cost: <input type="text" name="cost"><br />';
echo '<input type="submit" value="Do-It"></form>';
# close the connection
$DBH = null;
?>
【问题讨论】:
那么您是遇到实际问题,还是只是在寻找一般代码建议? 您的表单操作为空。 @Fred - 如果没有指定表单操作,它将返回到相同的 URL。 @Fred -$_SERVER['PHP_SELF']
只会给你脚本名称;如果您将该操作留空,它将提交到同一页面,但还会包含存在的任何查询字符串。
@SiLeNCeD 你试过hjpotter92's
单线方法吗? $STH->bindParam(':name', $_POST['name']);
等等?这也有助于验证过程。
【参考方案1】:
为什么要让用户发送空白表单?使用 javascript 在客户端处理“请提供所有数据”警告。不要让表单在不满足所有要求的情况下通过 javascript。
【讨论】:
【参考方案2】:要检查请求是否为 POST 类型,请使用 $_SERVER['REQUEST_METHOD']
Documentation
// Get POST variables
$name = isset($_POST['name']) ? $_POST['name'] : '';
$name = isset($_POST['email']) ? $_POST['email'] : '';
$name = isset($_POST['phone']) ? $_POST['phone'] : '';
$name = isset($_POST['detail']) ? $_POST['detail'] : '';
$name = isset($_POST['cost']) ? $_POST['cost'] : '';
If($_SERVER['REQUEST_METHOD'] == "POST")
Try
Remainder of code
【讨论】:
所以我尝试添加上述内容并将我的数据压缩到 Try.这允许一切都通过空数据。删除了顶部,所以也这样做了。我为完成这项工作所做的就是将您的 $_SERVER Request 方法与 Fred 的 if 语句混合在一起,并稍作修改(即将发布)。感谢@david strachan 为我指明了正确的方向。非常感谢。【参考方案3】:这不是答案,而是一个可以提供帮助的表单验证功能。
我确信有多种方法可以实现这一点,但它肯定会让你开始。
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$detail = $_POST['detail'];
$cost = $_POST['cost'];
if (isset($_POST['submit']))
if (empty($name) || empty($email) || empty($phone))) || empty($detail))) || empty($cost))
// do something
exit;
if (!empty($name) || !empty($email) || !empty($phone))) || !empty($detail))) || !empty($cost))
// do something else
// for example, write the data in database
exit;
【讨论】:
所以我按原样使用了上面的方法,它给了我与发送我到这里的相同的结果......没有做任何事情。我使用上面大卫的方法而不是 $_POST Submit 方法,然后将其与您的解决方案混合。即将发布结果。我感谢你给我的所有帮助。非常感谢!【参考方案4】:从以下切换排序
$STH->bindParam(':name', $name);
$STH->bindParam(':email', $email);
$STH->bindParam(':phone', $phone);
$STH->bindParam(':detail', $detail);
$STH->bindParam(':cost', $cost);
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$detail = $_POST['detail'];
$cost = $_POST['cost'];
到
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$detail = $_POST['detail'];
$cost = $_POST['cost'];
$STH->bindParam(':name', $name);
$STH->bindParam(':email', $email);
$STH->bindParam(':phone', $phone);
$STH->bindParam(':detail', $detail);
$STH->bindParam(':cost', $cost);
或简单地使用:
$STH->bindParam(':name', $_POST['name']);
$STH->bindParam(':email', $_POST['email']);
$STH->bindParam(':phone', $_POST['phone']);
$STH->bindParam(':detail', $_POST['detail']);
$STH->bindParam(':cost', $_POST['cost']);
【讨论】:
我实际上曾经尝试过,也认为它是有道理的,但它仍然没有发送任何东西。我会再试一次(我早上大部分时间都在为每个部分争吵)。 试过了...没有变化。我觉得我在这里错过了更大的东西。我注释掉了 var = $_POST 数据并使用了组合方法(就像我说的,似乎有道理)。它仍然没有发送数据。行动方面,我现在没有任何其他页面设置。我添加了一个占位符 (#) 只是为了将其保持在同一页面上。我还需要其他东西吗?。 虽然这不是问题的答案,但这是一个很好的建议,我已经更新了我的代码。感谢@hjpotter92 指出。我很感激。 快速提问(我希望)...如果我设置课程...我应该将$STH->bindParam(':name', $_POST['name'])
直接整合到课程中还是不?示例:class Client public $name; public function __construct($name) $this->name = $_POST['name'];
@SiLeNCeD 什么样的课?以上是关于使用 php 和 pdo 插入的表单的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDO 从 php 页面将具有更多列的表单数据插入 mysql 数据库