Jul7:PEAR::DB,プレースホルダ

プレースホルダを使うことによって、文字列の一部を他の文字列に置換する。文字列の一部を一般化し、そこにスカラー量や文字列を入れ込むことが出来るので便利。

$str = $db_connect->prepare("SELECT * FROM pref_info WHERE userid=(?)");
$str = $db_connect->execute($str,20);

prepareというのが、SQLを後で送信するための準備であり、execute(第一引数)で$strクエリを送信。第二引数は(?)の部分に入る値を指定している。

もし(?)が2個ある場合は、第二引数を配列にしてあげればよい。つまり、

$str = $db_connect->execute($str,array(20,10));

のようにすればよい。エスケープ処理を行ってくれるので、より簡潔にクエリを送信することが出来る。

以降、送信クエリのスクリプト

///////////////クエリ準備///////////////////////////
        $sql2 = $db_connect->prepare(
            "INSERT INTO user_info(
                familyname
                ,firstname
                ,familynamekana
                ,firstnamekana
                ,sex
                ,prefid
                ,zip1
                ,zip2
                ,address1
                ,address2
                ,email
                ,hobby
                ,other_hobby
                ,opinion
                ,createtime
                ,updatetime
            )
            VALUES
             (?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),NOW())");
/////////////クエリ送信/////////////////////////////////////
        $sql2 = $db_connect->execute($sql2,array(
             $_POST["lastname"]
            ,$_POST["firstname"]
            ,$_POST["lastnamekana"]
            ,$_POST["firstnamekana"]
            ,$_POST["sex"]
            ,$_POST["prefid"]
            ,$_POST["zip1"]
            ,$_POST["zip2"]
            ,$_POST["address1"]
            ,$_POST["address2"]
            ,$_POST["mail_address"]
            ,$h_array2
            ,$_POST["other"]
            ,$_POST["comment"]
        ));
            if(DB::isError($sql2)){
                $view = "top";
                $error[]="データを登録できませんでした。再度登録をお願いします。<br />";
            }else{
?>

メモ
・user_idはオートインクリメントでレコードが追記されたら勝手に入ってくるので、クエリにわざわざ入れる必要はない。
mysqlにNOW()関数があるので、これを使う。

なお、上記のクエリ送信の流れは、以下、

///////////////////クエリ準備//////////////////////////
        $sql2 =
            "INSERT INTO user_info(
                familyname
                ,firstname
                ,familynamekana
                ,firstnamekana
                ,sex
                ,prefid
                ,zip1
                ,zip2
                ,address1
                ,address2
                ,email
                ,hobby
                ,other_hobby
                ,opinion
                ,createtime
                ,updatetime
            )
            VALUES
             (?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),NOW())";
//////////////////クエリ送信///////////////////////////////
        $sql2 = $db_connect->query($sql2,array(
             $_POST["lastname"]
            ,$_POST["firstname"]
            ,$_POST["lastnamekana"]
            ,$_POST["firstnamekana"]
            ,$_POST["sex"]
            ,$_POST["prefid"]
            ,$_POST["zip1"]
            ,$_POST["zip2"]
            ,$_POST["address1"]
            ,$_POST["address2"]
            ,$_POST["mail_address"]
            ,$h_array2
            ,$_POST["other"]
            ,$_POST["comment"]
        ));
            if(DB::isError($sql2)){
                $view = "top";
                $error[]="データを登録できませんでした。再度登録をお願いします。<br />";
            }else{
?>

と一緒。$sql2に?の入ったクエリを作っておき、そのクエリをqueryコマンドで送信する。なお、その時第2引数に配列で?に入る文字を入れるのはexecuteと同じ。