【问题标题】:Syntax for if/else statement if insert was successful in a PDO prepared statement如果在 PDO 准备语句中插入成功,则 if/else 语句的语法
【发布时间】:2012-11-29 18:54:13
【问题描述】:

我正在尝试从 mySql 语句切换到 PDO 准备语句,但我无法确定插入成功时必须使用的 if/else 语句的正确语法(以前是 @987654321 @)。

我知道 $stmt->execute();成功时返回 true,失败时返回 false,但我无法确定如何设置语句以对此采取行动。

新代码(PDO 准备语句)

$gender = $_POST['gender'];  
if ($gender==="female" ) {
try {      
   $stmt = $conn->prepare('INSERT INTO customer_info (fname...) VALUES(:fname...)');
   $stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
   $stmt->execute();   
    } catch(PDOException $e) {
  echo $e->getMessage();
}

这是原来的if ($gender==="female")函数的其余部分

$result = @mysql_query($qry);    
    if($result) {          
      $qry="SELECT * FROM customer_info WHERE user_name='$_POST['user_name']' AND password='$_POST['password']'";
      $result=mysql_query($qry);          
if($result) {
    if(mysql_num_rows($result) == 1) {
        //user_name Successful
        session_regenerate_id();
        $member = mysql_fetch_assoc($result);
        $_SESSION['SESS_USER_ID'] = $member['user_id'];
        session_write_close();
        header("location: flatter_iframe.html");
        exit();
    }else {        
        header("location: login_failed.html");
        exit();
    }   

为了简化,我已经删除了大部分变量(因为代码是一样的)

【问题讨论】:

    标签: php if-statement pdo insert prepared-statement


    【解决方案1】:

    您可以通过多种方式检查 INSERT 是否正常工作。

    1。返回值来自 $stmt->execute()

    如您所说,$stmt->execute(); 在成功时返回 true,在失败时返回 false。所以你可以使用:

    $result = $stmt->execute();
    if ($result) {...}
    

    PDO Execute documentation here

    2。行数

    rowCount 将返回受查询影响的行数。成功插入后,这应该是 1。

    $stmt->execute();
    $affected_rows = $stmt->rowCount();
    if ($affected_rows == 1) {...} 
    

    PDO rowCount documentation here

    3。最后插入的 ID

    如果您的表有 ID 列,您可以使用 lastInsertId() 返回最后插入的行的 ID。

    $stmt->execute();
    $newCustomerInfoId = $pdo->lastInsertId();
    if ($newCustomerInfoId) {...}
    

    注意:您必须在 PDO 对象上调用 lastInsertId,而不是 $stmt

    PDO lastInsertId documentation here

    【讨论】:

    • 谢谢你把它说得这么清楚 :-) 令人惊讶的是,弄清楚这一点比首先学习 php 更令人困惑 ;-) 只是为了确保我正确理解你,我更改了“$result=mysql_query($qry);”的两个实例到“$result=$stmt->execute();”并将“if(mysql_num_rows($result) == 1)”更改为“$affected_rows = $stmt->rowCount(); if ($affected_rows == 1)”。我做对了吗?另外,我可以保留其余代码吗?我知道在这些 cmets 中阅读代码可能很困难,所以我也将新代码放在了小提琴中 :-) jsfiddle.net/chayacooper/ujV6T/1
    • 另外,一般来说,您应该将代码分解成简单的段,并在将它们加在一起之前检查每个段的输出。 var_dump 对此很有用,用于控制台调试的 firePHP 也是如此。
    • 非常感谢!!!我很想查看代码,但该链接存在内部服务器错误。如果有机会,您介意重新加载吗?
    • 我花了一点时间才让一切正常工作,但看起来是这样 :-D 而且我想我已经掌握了哪些语句需要重写才能与 PDO 一起使用:- ) 它插入了每个条目两次,我发现改变 $selectResult = $stmt->execute(); if($selectResult) {…} 到 if($qry) {…},所以只是想确保没问题;我在使用 mail() 函数时遇到了一点困难,但我认为我做对了。这是我的新代码:snipt.org/ygigi6
    • 我仍然困惑的是如何重用 bindParam 语句、名称和值(在这种情况下,如果 $gender 是男性,我有一个单独的 INSERT 语句)。我假设有办法做到这一点,但是当我尝试将 bindParam 语句移动到 $gender if/else 语句之前它停止工作。
    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2015-03-23
    • 2012-09-17
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多