【问题标题】:PHP Data Object insert not executingPHP数据对象插入未执行
【发布时间】:2014-03-20 19:51:56
【问题描述】:

我刚刚更改为使用 PDO 的 PHP 表单。我唯一能说的是执行不起作用。我应该通过它传递一些东西吗?

$db = new PDO('mysql:host=localhost;dbname=x;charset=utf8', 'x', 'x');
if ( !$db )
{
die('Could not connect: ' . mysql_error());
}

$ipaddress = $_SERVER['REMOTE_ADDR'];
$mail = $_POST['mail'];

$stmt = $db->prepare("SELECT * FROM ucm_signup WHERE email =? ");
$stmt->bindValue(1, $mail, PDO::PARAM_STR);
$stmt->execute();

if($stmt->rowCount()== 0) { 
//if there are no duplicates...insert
$sql = $db->prepare("INSERT INTO ucm_signup (company, address1, address2, city, province, zip, fname, lname, email, phone, session, iama, buyfrom, group1, ipaddress)
VALUES (:company, :address1, :address2, :city, :province, :zip, :fname, :lname, :mail, :phone, :session, :iama, :buyfrom, :group1, :ipaddress)");
    $sql->bindParam(":company", $_POST['company'],PDO::PARAM_STR);
$sql->bindParam(":address1", $_POST['address1'],PDO::PARAM_STR);
$sql->bindParam(":city", $_POST['city'],PDO::PARAM_STR);
$sql->bindParam(":province", $_POST['province'],PDO::PARAM_STR);
$sql->bindParam(":zip", $_POST['zip'],PDO::PARAM_STR);
$sql->bindParam(":fname", $_POST['fname'],PDO::PARAM_STR);
$sql->bindParam(":lname", $_POST['lname'],PDO::PARAM_STR);
$sql->bindParam(":email", $_POST['email'],PDO::PARAM_STR);
$sql->bindParam(":phone", $_POST['phone'],PDO::PARAM_STR);
$sql->bindParam(":session", $_POST['session'],PDO::PARAM_STR);
$sql->bindParam(":imea", $_POST['imea'],PDO::PARAM_STR);
$sql->bindParam(":buyfrom", $_POST['buyfrom'],PDO::PARAM_STR);
$sql->bindParam(":imea", $_POST['imea'],PDO::PARAM_STR);
$sql->bindParam(":group1", $_POST['group1'],PDO::PARAM_STR);
$sql->bindParam(":ipaddress", $_POST['ipaddress'],PDO::PARAM_STR);
$sql->execute();
}   

我的数据库表没有记录。谢谢

【问题讨论】:

  • 您似乎没有为参数:address2设置值
  • 没有为:iama 绑定值,而是将值绑定到:imea,而:mail 的情况在您的查询中也不存在

标签: php mysql pdo


【解决方案1】:

您的绑定参数中缺少一些占位符,请仔细检查

$sql->bindParam(":address1", $_POST['address1'],PDO::PARAM_STR);
$sql->bindParam(":address2", $_POST['city'],PDO::PARAM_STR);
//address2 was missed, probably error is column doesn't match values
$sql->bindParam(":email", $_POST['email'],PDO::PARAM_STR); //supposed to be mail
$sql->bindParam(":imea", $_POST['imea'],PDO::PARAM_STR); //supposed to be iama

您可能需要检查pdo errors,这里是取自手册的示例

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

正确添加此属性后,如果发生任何错误,pdo 会通知您

【讨论】:

  • 因为万一你犯了错误,像现在这样,pdo 会告诉你你的查询有什么问题
  • 实际上,将:iama 更改为:imea 会更容易,因为所有其他单词都是imea,而不是进行3 次更改。 ;-)
  • 是的,可能会是
  • 同意,我会去打几枪惩罚自己。 :D
【解决方案2】:

PHP 用户就是 PHP 用户。

首先,他们正在编写一堵代码墙,其中包括不断重复近百个变量。
然后他们就完全迷路了。

虽然一切都可以用简短的代码来完成,但每个字段名称只写ONCE

$allowed = array('company', 'address1', 'address2', 'city', 'province', 
                 'zip', 'fname', 'lname', 'email', 'phone', 'session', 
                 'iama', 'buyfrom', 'group1', 'ipaddress');
$_POST['ipaddress'] = $_SERVER['REMOTE_ADDR'];
$sql = "INSERT INTO ucm_signup SET ".pdoSet($allowed, $values);
$stm = $dbh->prepare($sql);
$stm->execute($values);

pdoSet() 辅助函数可以存储在其他地方,并重用用于每个插入或更新查询

function pdoSet($fields, &$values, $source = array()) {
  $set = '';
  $values = array();
  if (!$source) $source = &$_POST;
  foreach ($fields as $field) {
    if (isset($source[$field])) {
      $set.="`".str_replace("`","``",$field)."`". "=:$field, ";
      $values[$field] = $source[$field];
    }
  }
  return substr($set, 0, -2); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2017-07-17
    • 2023-01-11
    • 2013-04-15
    • 2014-04-29
    • 2016-06-19
    相关资源
    最近更新 更多