PHP数据对象执行问题

时间:2014-03-21 16:13:30

标签: php mysql pdo phpmyadmin

我的PHP表单正在POST到一个连接到我的数据库并且应该插入记录的php文件。

截至目前,我已经测试了连接并且它正在工作,我的SELECT语句正在运行。但我的INSERT不是。我在执行前做了echo $sql->rowCount();并返回“0”。每个值应该有一行吗?

我的代码:

try {
$db = new PDO('mysql:host=localhost;dbname=x;charset=utf8', 'x', 'x');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$db = new PDO('mysql:host=localhost;dbname=x;charset=utf8', 'x', 'x');
$ipaddress = $_SERVER['REMOTE_ADDR'];
$email = $_POST['email'];

$sql = $db->prepare("INSERT INTO ucm_signup (company, address1, address2, city, province, zip, fname, 
        lname, email, phone, session, iama, buyfrom, ipaddress)
VALUES (:company, :address1, :address2, :city, :province, :zip, :fname, :lname, :email, :phone, :session, :iama, :buyfrom, :ipaddress)");

$sql->bindParam(":company", $_POST['company'],PDO::PARAM_STR);
$sql->bindParam(":address1", $_POST['address1'],PDO::PARAM_STR);
$sql->bindParam(":address2", $_POST['address2'],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(":iama", $_POST['iama'],PDO::PARAM_STR);
$sql->bindParam(":buyfrom", $_POST['buyfrom'],PDO::PARAM_STR);
$sql->bindParam(":ipaddress", $_POST['ipaddress'],PDO::PARAM_STR);
$sql->execute();
  //$db = null;
  //header( "Location: http://www.x.com/company/ucm_signup2" ); 

关于我的执行原因不正确的任何想法?谢谢

2 个答案:

答案 0 :(得分:1)

您的参数已混合

......
$ipaddress = $_SERVER['REMOTE_ADDR'];
......

$sql->bindParam(":ipaddress", $_POST['ipaddress'],PDO::PARAM_STR);

没有$_POST['ipaddress']

答案 1 :(得分:0)

您的代码有几个逻辑错误。第一个错误是依靠PDO为您提供rowCount()。 SELECT语句不可靠。

您遇到的第二个错误是检查PHP方面的重复记录。那是错的。 想象一下,您自己使用同一封电子邮件注册两次。 PHP和MySQL之间存在短暂的延迟,在此期间服务器可以接受两个请求,两个请求都带有相同的有效负载(电子邮件),并且在发生任何插入之前 - 您(错误地)检查确实没有#t这样的电子邮件在数据库中。

你最终得到的是重复的。现在将示例扩展为2个以上的请求。

您无法在PHP中执行数据完整性检查

你做的第三个错误是执行SELECT然后计算行数。相反,你应该已经完成​​了

SELECT COUNT(*) as num_records FROM table WHERE condition = :condition

您将始终拥有该查询的结果。并且传输的数据较少。

那你该怎么办?简单地 - 将UNIQUE约束添加到电子邮件字段,尝试以插入数据并捕获异常。如果异常消息显示"重复输入密钥..."然后你知道收到了电子邮件,你可以将相应的信息发送给客户。

您不需要先使用SELECT查询。 您不需要检查行数。 您完全可以确保数据完整性。 你的代码最少。