我的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" );
关于我的执行原因不正确的任何想法?谢谢
答案 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查询。 您不需要检查行数。 您完全可以确保数据完整性。 你的代码最少。