在PHP中使用PDO将HTML表单中的数据插入MySQL

在PHP中使用PDO将HTML表单中的数据插入MySQL,php,html,mysql,forms,pdo,Php,Html,Mysql,Forms,Pdo,我目前正在学习如何正确使用PDO来构建基于PHP/MySQL的应用程序。下面的代码应该从HTML表单中获取用户数据并插入到数据库中,但是当表单提交时,页面变为空白,不会返回任何错误消息,也不会向数据库中添加任何内容 谨此致谢: <?php if ( empty( $_POST ) ){ ?> <form name='registration' action='user_register.php' method='POST'> <label for 'title'&g

我目前正在学习如何正确使用PDO来构建基于PHP/MySQL的应用程序。下面的代码应该从HTML表单中获取用户数据并插入到数据库中,但是当表单提交时,页面变为空白,不会返回任何错误消息,也不会向数据库中添加任何内容

谨此致谢:

<?php
if ( empty( $_POST ) ){
?>
<form name='registration' action='user_register.php' method='POST'>
<label for 'title'>Title: </label>
<input type="text" name="title" />

<label for 'url'>URL: </label>
<input type="text" name="url" />

<label for 'contact'>Contact: </label>
<input type="text" name="contact" />

<label for 'category'>Category: </label>
<input type="text" name="category" />

<label for 'location'>Location: </label>
<input type="text" name="location" />

<label for 'founded'>Founded: </label>
<input type="text" name="founded" />

<label for 'rss'>RSS: </label>
<input type="text" name="rss" />

<label for 'twitter'>Twitter: </label>
<input type="text" name="twitter" />

<label for 'facebook'>Facebook: </label>
<input type="text" name="facebook" />

<label for 'google'>Google: </label>
<input type="text" name="google" />

<label for 'youtube'>YouTube: </label>
<input type="text" name="youtube" />

<label for 'pinterest'>Pinterest: </label>
<input type="text" name="pinterest" />

<label for 'instagram'>Instagram: </label>
<input type="text" name="instagram" />


<button type="submit">Submit</button>
</form>

<?php
} else {

try {

$db_user = 'testuser';
$db_pass = 'testpassword';
$db = new PDO( 'mysql:host=localhost;dbname=testdatabase', $db_user, $db_pass );

$form = $_POST;
$title = $form[ 'title' ];
$url = $form[ 'url' ];
$contact = $form[ 'contact' ];
$category = $form[ 'category' ];
$location = $form[ 'location' ];
$founded = $form[ 'founded' ];
$rss = $form[ 'rss' ];
$twitter = $form[ 'twitter' ];
$facebook = $form[ 'facebook' ];
$google = $form[ 'google' ];
$youtube = $form[ 'youtube' ];
$pinterest = $form[ 'pinterest' ];
$instagram = $form[ 'instagram' ];

$sql = "INSERT INTO testtable ( 
    title, url, contact, category, location, 
    founded, rss, twitter, facebook, 
    google, youtube, pinterest, instagram ) 
    VALUES ( 
    :title, :url, :contact, :category, 
    :location, :founded, :rss, :twitter, 
    :facebook, :google, :youtube, :pinterest, :instagram )";

$query = $db->prepare( $sql );
$query->execute( array( ':title'=>$title, ':url'=>$url, ':contact'=>$contact, ':category'=>$category, ':location'=>$location, ':founded'=>$founded, ':rss'=>$rss, ':twitter'=>$twitter, ':facebook'=>$facebook, ':google'=>$google, ':youtube'=>$youtube, ':pinterest'=>$pinterest, ':instagram'=>$instagram ) );

}
catch(PDOException $e)
{
echo $e->getMessage();
}
}

?>

标题:
网址:
联系人:
类别:
地点:
成立:
RSS:
推特:
脸谱网:
谷歌:
YouTube:
Pinterest:
Instagram:
提交
提交
应该是

<input type="submit" value="Submit" />


*至少我是这样认为的,如果我错了,请有人纠正我。

看起来像是第4行的语法错误:

<form name='registration' action='user_register.php' method='POST'/>

变成:

<form name='registration' action='user_register.php' method='POST'>

编辑:正如有人提到的,这实际上不会阻止您提交表单

我已经盯着你的代码看了一段时间了,我看不出它为什么不起作用。问题可能在其他地方


做一些基本的测试来确保你的技术能够正常工作。首先,我要编写一个简单的4行脚本,在一个准备好的语句中将一个值写入一个表中的一列,以确保PDO和MySQL联机。

您正在处理的文件名是什么

action='user_register.php'
可能是因为user_register.php不是正确的文件名而变为空白

试一试

action=''
好的,这是我的看法

你可能在某个地方出错,并没有为开发目的而正确地报告它们(因此是空白屏幕)。

确保您的
php.ini
文件具有以下键/值对

error_reporting = E_ALL
display_errors = On
如果必须进行任何更改,则需要重新启动web服务器

您应该做的另一件事是将PDO设置为抛出异常。将您的连接线更改为

$db = new PDO('mysql:host=localhost;dbname=testdatabase;charset=utf8', $db_user, $db_pass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
在执行查询之后,我还会添加一些形式的反馈,以便您至少知道发生了什么,例如

$query->execute(...);
printf('<p>Inserted %d row</p>', $query->rowCount());
$query->execute(…);
printf('插入了%d行,$query->rowCount());

最后,删除
try
和整个
catch
块。PHP异常包含用于调试的有价值的信息。一旦您准备好投入生产,您就可以实现一个更全局的错误/异常处理机制,但现在,我只想让异常冒泡并终止您的程序。

我认为参考这些可能会有所帮助



我不认为这会有什么不同,但是在
execute()
调用中,参数前面不需要冒号。例如,将
':title'=>$title
更改为
'title'=>$title
。可能存在数据库连接错误,我建议暂时启用php错误,然后重试,查看是否引发了任何错误。ini_set('display_errors',1)@user2668563您能
var_dump($form)
echo$sql?我刚从我学习过的教程中学习到这一点-我在没有冒号的情况下尝试过,但你是对的,没有任何区别。@GeorgeBrighton PHP会自动添加冒号前缀,如果你省略了iTunes,当然不会-
将正确提交表单。@GeorgeBrighton感谢你提供的信息!我的眼睛以前从未见过这样的情况。很高兴知道。谢谢-我尝试了建议的替代方案,但它对代码的行为没有任何影响。确实-它使HTML无效,但提交的帖子数据非常好。我很惊讶这不是正确的解决方案。自动关闭表单(在我看来)将从POST有效负载中删除所有输入字段。在browsersThanks中可能会有不同的行为-我去掉了错误的斜杠,但它仍然以相同的方式运行。我认为Chrome忽略了它。仅仅因为它不能解决主要问题并不意味着它应该被否决。绝对是正确的文件名,虽然我尝试了这段代码以防万一,但仍然收到同样的问题。@user2668563我完全没有主意:/
$db = new PDO('mysql:host=localhost;dbname=testdatabase;charset=utf8', $db_user, $db_pass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
$query->execute(...);
printf('<p>Inserted %d row</p>', $query->rowCount());