2

私はまだ mysql_* のものを PDO と準備されたステートメントに変換しようとしています。Web全体でこれを行うのは本当に大変な作業ですが、私はあきらめず、いくつかの問題に遭遇しました.

私の質問はmysql_query()、1 つの関数内の複数のコマンドについてです。したがって、コードに次のようなものがある場合:

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

実際には 2 つの質問があります。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
}

最初に PDO に存在する必要がある場合に挿入コマンドが実行された場合、stmt と PDO でサック チェックを使用する方法は?

そして最後の質問... PDO の準備済みステートメントで既に bindValue を使用している場合、後でコードで is_numeric() 関数を使用する必要がありますか?

要約:

1) bindValue パスワードを文字列 (PDO::PARAM_STR) として使用してもよろしいですか?

2) より多くのクエリがあるのでステートメントを追加するとき、$stmt、$stmt2、$stmt3 のように別の名前を付ける必要がありますか、それともすべてのステートメントを同じにする必要がありますか?

3) PDO の準備済みステートメントで既に bindValue を使用している場合、後でコードで is_numeric() 関数を使用する必要がありますか?

皆さん、ありがとうございました

4

3 に答える 3

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 に答える
1
  1. はい

  2. 別のものを必要としないため、それらに名前を付けることができ$stmtます(実行したら完了なので、必要に応じて上書きできます)。しかし、私が得られないのは、3つの異なるステートメントではなく、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
}
于 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 に答える