为啥这个 PHP 脚本不会在 MySQL 数据库中插入表单数据?

Posted

技术标签:

【中文标题】为啥这个 PHP 脚本不会在 MySQL 数据库中插入表单数据?【英文标题】:Why won't this PHP script insert form data in MySQL db?为什么这个 PHP 脚本不会在 MySQL 数据库中插入表单数据? 【发布时间】:2012-03-27 03:12:43 【问题描述】:

在提交表单时,我得到一个空白页 (insert.php),没有错误,也没有成功消息。

这是表格:

<form action="insert.php" method="post">
Firstname: <input type="text" name="first_name" id="first_name" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>

这是脚本:

mysql_select_db("my_db", $con);


$stmt = $db->prepare('INSERT INTO my_table (first_name) VALUES (:first_name)');

$stmt->execute(':first_name', $first_name);


if (!mysql_query($stmt,$con))
  
  die('Error: ' . mysql_error());
  
echo "1 record added";

mysql_close($con)
?>

【问题讨论】:

实际上是所有代码吗?你从哪里得到 $first_name? 解析错误?你检查过日志吗? 【参考方案1】:

您正在尝试同时使用 2 个不同的 MySQL 接口。 mysql_* 系列函数使用 ext/mysql 扩展... prepared statement 的东西是 PDO。您需要选择其中之一。由于 PDO 确实是生病的方式,所以给你一个例子:

$db = new PDO($dsn, $user, $password);

try 
   $stmt = $db->prepare('INSERT INTO my_table (first_name) VALUES (:first_name)');
   if($stmt->execute(array(':first_name' => $first_name))) 
      echo "1 record added";
   

 catch (PDOException $e) 
  die('Error: ' . $e->getMessage());


Mysql DSN 上的文档(PDO constructor 的第一个参数)可以在here 找到。

【讨论】:

谢谢。我又上路了。我想这在my post yesterday 中没有提到(或者假设我知道)。 是的,可能假设您不只是复制和粘贴,而是去研究 PDO 的文档,然后意识到它是一个完全不同的扩展,具有与那里找到的示例不同的界面。【参考方案2】:

您需要创建一个 PDO 对象才能使用准备好的语句。相反,您打开了与mysql_connect() 的连接。两者不能混用,PDO 是它们之间的首选,因为通过使用准备好的语句(以及其他原因)更容易保护它。

来自the PDO docs:

// This establishes your connection using PDO.
// The PDO connection object is $db

/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try 
    $db = new PDO($dsn, $user, $password);
 catch (PDOException $e) 
    echo 'Connection failed: ' . $e->getMessage();

将关联数组传递给execute(),而不是代表占位符的参数列表。

// Now that the PDO object is successfully created, prepare your statement
$stmt = $db->prepare('INSERT INTO my_table (first_name) VALUES (:first_name)');

// Arg to execute() should be an associative array
$stmt->execute(array(':first_name' => $first_name));

以下对mysql_query() 的调用是不必要的,因为您已经使用 PDO 执行了准备好的语句。

// Don't do this
// mysql_select_db("my_db", $con);

// Or this...
//if (!mysql_query($stmt,$con))
//
//  die('Error: ' . mysql_error());
//

// Or this...
// mysql_close($con)

【讨论】:

以上是关于为啥这个 PHP 脚本不会在 MySQL 数据库中插入表单数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 控制器使用 request.post() 调用 python 脚本永远不会返回。为啥?

在shell脚本执行sql语句为啥会报错

为啥这个 PHP 脚本(由 AJAX 调用)随机无法正确加载 SESSION?

如果我迅速获得战利品然后离开,为啥这个 roblox 脚本不会保存?

PHP数组不会填充mysql数据[重复]

php在连接mysql时为啥会包这样的错误?