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();                      
}

我实际上有两个问题:是否可以将密码绑定为字符串 (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
}

如果插入命令首先需要在 PDO 中存在,如何在 stmt 和 PDO 中使用吸盘检查?

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

所以总结:

1) 可以将密码绑定为字符串 (PDO::PARAM_STR) 吗?

2) 当我添加语句时,因为它有更多查询,我应该将它们命名为不同的名称,如 $stmt、$stmt2、$stmt3 还是每个语句都相同?

3)当我已经在 PDO 中的准备好的语句中绑定值时,我以后在代码中是否仍然需要使用 is_numeric() 函数(可能是为了对变量作弊)?

谢谢你们

4

3 回答 3

1
  1. 是的

  2. 您可以为它们命名,$stmt因为您不需要其他名称(一旦执行就完成了,因此您可以根据需要覆盖)。但我不明白的是,你为什么不把它全部放在 1 个语句中而不是 3 个不同的语句中?

  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
}
于 2012-06-08T13:22:21.240 回答
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);
?>
于 2012-06-08T13:27:09.323 回答
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
}
于 2012-06-08T13:34:19.060 回答