首页 文章

是否可以在PDO中使用相同的变量并检查多个预准备语句?

提问于
浏览
2

我仍在尝试将mysql_ *事物转换为PDO和预处理语句 . 在整个网络上做这件事真的很辛苦,但我没有放弃,我遇到了一些问题 .

我的问题是在一个函数中有多个 mysql_query() 命令 . 所以当我在代码中有这样的东西时:

if (something)
{
   mysql_query("UPDATE account SET pass=$pass WHERE id=$id");
   mysql_query("UPDATE account_2 SET lock=$lock WHERE id=$id");
   mysql_query("UPDATE account_3 SET surname=$surname WHERE id=$id");                      
}

并希望将其转发给PDO准备好的声明 . 我已经知道我必须做这样的事情:

if (something)
{
    $stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
    $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();                      
}

我实际上有两个问题:bindValue密码是否可以作为字符串(PDO :: PARAM_STR)?当我添加其他语句时,因为它有更多的查询,我应该像$ stmt2那样命名它们,或者当它被执行时我只能这样做$ stmt吗?

if (something)
{
    $stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
    $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();

    $stmt = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
    $stmt->bindValue(':lock', $lock, PDO::PARAM_INT);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();                      
}

或者我应该这样做?

if (something)
{
    $stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
    $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();

    $stmt2 = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
    $stmt2->bindValue(':lock', $lock, PDO::PARAM_INT);
    $stmt2->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt2->execute();                      
}

还有一个在最后 . 当我在代码函数/检查中这样:

if (mysql_query("INSERT INTO account (id, pass, email, request_time, status) VALUES ('".$id."', '".$pass."', '".$mail."', '".time()."', '".$status."')"))
{
    blabla
}

如果执行insert命令,如果首先需要在PDO中,那么如何使用stck和PDO进行suck检查?

最后一个问题......当我已经在PDO中的预准备语句中使用bindValue时,我以后在代码中是否还需要使用is_numeric()函数?

总结:

1)bindValue密码可以作为字符串(PDO :: PARAM_STR)吗?

2)当我添加语句时,因为它有更多的查询,我应该像$ stmt,$ stmt2,$ stmt3或每个语句一样命名它们?

3)当我已经在PDO中的预准备语句中使用bindValue时,我后来在代码中仍然需要使用is_numeric()函数(可能是为了某些与变量作弊)?

谢谢你们

3 回答

  • 1
    • 是的

    • 你可以将它们命名为 $stmt 因为你赢了't need a different one (once you execute you are done, so you can overwrite if you want to). But What I don' t这就是为什么你不把它全部放在1个陈述而不是3个不同的陈述中?

    • 这里真的不明白你的意思吗?如果你需要知道它是否是数字,你将需要is_numeric()是的 .

    并且您可以使用 $stmt->execute(); 检查它是否已成功执行,因为如果成功则返回true .

    所以你会这样做

    $passed = $stmt->execute();
    
    if($passed)
    {
        //fetch
    }
    

    这是一个简单的例子:

    $stmt = $db->prepare("UPDATE `account`
                             SET account.pass = ?
                           WHERE account.id = ?
                           LIMIT 1");
    
    $stmt->bindParam(1, $pass, PDO::PARAM_STR);
    $stmt->bindParam(2, $id, PDO::PARAM_INT);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    
    if($stmt->execute())
    {
        $stmt->fetch(); //fetch your data
    }
    else
    {
        //error
    }
    
  • 1

    为什么不在1个查询中这样做:

    <?php
    if (something){
        $stmt = $db->prepare("UPDATE account SET pass=:pass, lock=:lock, surname=:surname WHERE id=:id");
    
        $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
        $stmt->bindValue(':lock', $lock, PDO::PARAM_INT);
        $stmt->bindValue(':surname', $surname, PDO::PARAM_STR);
        $stmt->bindValue(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
    
    }
    ?>
    

    您也可以创建一个处理所有更新的函数,然后您只需要传递一个值数组,并且该函数可以在整个脚本中重复使用,为什么在您可以调用单个函数时为每个更新查询重复代码 .

    <?php
    /**
     * Update multiple rows
     *
     * @param string $table
     * @param array $values
     * @param sring $pk
     * @param int $id
     */
    function Update($table, $values){
        //connect ect here
    
        $fieldnames = array_keys($values[0]);
        $fields = '';
        foreach($fieldnames as $keys){
            //continue as id, id is used in the WHERE clause
            if($keys=='id'){continue;}
    
            $fields .= $keys.'=:'.$keys.', ';
        }
        $fields = trim($fields,', ');
    
        /*** put the query together ***/
        $sql = "UPDATE {$table} SET {$fields} WHERE id=:id";
    
        /*** prepare and execute $db being your PDO connection object ***/
        $statement = $db->prepare($sql);
    
        foreach($values as $vals){
            $statement->execute($vals);
        }
    }
    
    $updates = array(array('id'=>1,'pass'=>'password1','lock'=>1,'surname'=>'Foo'),
                     array('id'=>2,'pass'=>'password2','lock'=>2,'surname'=>'Bar'),
                     array('id'=>3,'pass'=>'password3','lock'=>3,'surname'=>'Cherone'));
    
    Update('account', $updates);
    ?>
    
  • 1
    if(something){
        $stmt = $db->prepare("UPDATE account SET pass=:pass WHERE id=:id");
        try{
            $flag = $stmt->execute(array(":pass"=>$pass,":id"=>$id));
        }catch(PDOException $e){
            do something;
        }
    
        if(!(bool)$flag){
            $errorInfo = $stmt->errorInfo();
            do something;
        }
    
        $stmt2 = $db->prepare("UPDATE account_2 SET lock=:lock WHERE id=:id");
        try{
            $flag2 = $stmt->execute(array(":lock"=>$lock,":id"=>$id));
        }catch(PDOException $e){
            do something;
        }
    
        if(!(bool)$flag2){
            $errorInfo = $stmt2->errorInfo();
            do something;
        }
    }
    
    $query0 = "INSERT INTO account (id, pass, email, request_time, status) VALUES (:id,:pass,:mail,:time,:status)";
    $pQuery0 = $db->prepare($query)
    
    try{
        $flag0 = $stmt->execute(array(":pass"=>$pass,":id"=>$id,":mail"=>$mail,":time"=>$time,":status"=>$status));
    }catch(PDOException $e){
        do something;
    }   
    
    if((bool)$flag2){
        do something
    }
    

相关问题