【问题标题】:PHP Data Object execute issue [closed]PHP数据对象执行问题[关闭]
【发布时间】:2014-04-29 02:58:23
【问题描述】:

我的 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" ); 

关于为什么我的执行不正确的任何想法?谢谢

【问题讨论】:

  • 执行哪个?您收到什么错误消息(显示或在日志中)? $_POST['ipaddress'] 是实际设置的,还是应该使用 $ipaddress
  • 在执行之前$sql->rowCount(); 是否有意义?查询尚未发送到数据库,因此不会有任何结果。
  • 这个问题和你的other question有什么区别?如果您的其他问题成功插入数据库,那么现在有什么问题? @DDDD 您是否要检查一个值是否已经存在?
  • 这个问题似乎跑题了,因为它是关于混合变量的。
  • @DDDD 无关个人 ;-)

标签: php mysql pdo phpmyadmin


【解决方案1】:

你的参数混合了

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

稍后

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

没有$_POST['ipaddress']

【讨论】:

    【解决方案2】:

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

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

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

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

    您犯的第三个错误是执行 SELECT 然后计算行数。相反,你应该这样做

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

    您将始终获得该查询的结果。而且要传输的数据更少。

    那你该怎么办?简单 - 将 UNIQUE 约束添加到电子邮件字段,try 以插入数据并捕获异常。如果异常消息显示“输入的重复密钥...”,那么您知道该电子邮件已被占用,您可以向客户端发送相应的消息。

    您不需要先使用 SELECT 进行查询。 您不需要检查行数。 您 100% 确定数据完整性正常。 你最终会得到更少的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多