-2

Googleコードの1つから次のコードをダウンロードしましたが、最後の挿入IDを取得する際に問題が発生します。

run()機能で見てください

このメソッドは、含まれているdelete、insert、select、またはupdateメソッドでは処理できない自由形式のSQLステートメントを実行するために使用されます。SQLエラーが生成されない場合、このメソッドは、DELETE、INSERT、およびUPDATEステートメントの影響を受ける行の数、またはSELECT、DESCRIBE、およびPRAGMAステートメントの結果の連想配列を返します。

<?php

    class db extends PDO {

        private $error;
        private $sql;
        private $bind;
        private $errorCallbackFunction;
        private $errorMsgFormat;
        public $lastid;
        public function __construct($dsn, $user = "", $passwd = "") {
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            );

            try {
                parent::__construct($dsn, $user, $passwd, $options);
            } catch (PDOException $e) {
                $this->error = $e->getMessage();
            }
        }





        private function filter($table, $info) {
            $driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME);
            if ($driver == 'sqlite') {
                $sql = "PRAGMA table_info('" . $table . "');";
                $key = "name";
            } elseif ($driver == 'mysql') {
                $sql = "DESCRIBE " . $table . ";";
                $key = "Field";
            } else {
                $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $table . "';";
                $key = "column_name";
            }

            if (false !== ($list = $this->run($sql))) {
                $fields = array();
                foreach ($list as $record)
                    $fields[] = $record[$key];
                return array_values(array_intersect($fields, array_keys($info)));
            }
            return array();
        }

        private function cleanup($bind) {
            if (!is_array($bind)) {
                if (!empty($bind))
                    $bind = array($bind);
                else
                    $bind = array();
            }
            return $bind;
        }

        public function insert($table, $info) {
            $fields = $this->filter($table, $info);
            $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");";
            $bind = array();
            foreach ($fields as $field)
                $bind[":$field"] = $info[$field];
            return $this->run($sql, $bind);
        }

        public function run($sql, $bind = "") {
            $this->sql = trim($sql);
            $this->bind = $this->cleanup($bind);
            $this->error = "";

            try {
                $pdostmt = $this->prepare($this->sql);
                if ($pdostmt->execute($this->bind) !== false) {
                    if (preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
                        return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
                    elseif (preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql)) {
                       echo $this->lastInsertId();
                        return $pdostmt->rowCount();
                    }
                }
            } catch (PDOException $e) {
                $this->error = $e->getMessage();
                return false;
            }
        }




    }

    ?>

レコードの挿入に使用するコード

    $insert = array(
        "userid" => 12345,
        "first_name" => "Bhavik",
        "last_name" => "Patel",
        "email" => "bhavik@sjmtechs.com",
        "password" => "202cb962ac59075b964b07152d234b70"

   $db->insert("users",$insert);
    echo $db->lastid;
4

1 に答える 1

0

このinsert()関数では、を設定$lastidしたことがないため、正しい値になることはありません。次のようなものが必要になります。

insert()関数の次の行を変更します。

return $this->run($sql, $bind);

これに:

$rows = $this->run($sql, $bind);
$this->lastid = $this->lastInsertId();
return $rows;

lastInsertId()また、次のように、上記の変更を行わなくても、クラスの外部からにアクセスできる必要があります。

$db->insert("users",$insert);
echo $db->lastInsertId();
于 2012-06-22T12:31:48.207 に答える