1

globalPHP関数内の変数へのアクセスを使用しないようにするにはどうすればよいですか。それらを定数として格納できることはわかっていますが、変数には sql が含まれており、多数あります。このような...

$selectSql = 'select name from table where name = :thisName' and year = :thisYear;
$selectSqlBind = array(":thisName" => $thisName,":thisYear" => $thisYear);

これが私が現在行っている方法です

function myFunction (){
global $selectSql;
global $selectSqlBind;

$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}

私もできる

function myFunction ($selectSql,$selectSqlBind){
$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}

しかし、どうすればいいですか

function myFunction (){
$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}
4

2 に答える 2

6

これは、クラスを使用する目的です。たとえば、MySQLi クラスを簡単に拡張し、すべての機能を維持しながら、独自の関数を追加することができます。$this次に、次の代わりに、MySQLi ステートメントを単純に参照します$conn

<?php
    class DB extends mysqli {
        const PASSWORD_SALT = "abc123";
        public function AddUser($username, $password) {
            $addUser = $this->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)");
            $addUser->execute(array(":username" => $username, ":password" => md5(self::PASSWORD_SALT . $password)));
        }
    }
?>

2 つのロジックを分離したい場合は、これも非常に可能です。

$conn(クラス自体から) として参照されるクラス変数によって DB を参照します$this->conn。この変数をクラス外で使用したい場合は、次のようにして参照する必要がありprivate $connます。public $conn$db = new DB(); $db->conn->prepare(/*etc*/);

<?php
    class DB {
        const PASSWORD_SALT = "abc123";

        private $conn;

        public function __construct() {
            $this->conn = new mysqli("localhost", "foo", "bar", "foobar");
        }

        public function AddUser($username, $password) {
            $addUser = $this->conn->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)");
            $addUser->execute(array(":username" => $username, ":password" => md5(self::PASSWORD_SALT . $password)));
        }
    }
?>
于 2013-06-17T08:51:14.767 に答える
1

これには関数パラメーターを使用する必要があるため、クエリとバインドパラメーターを一緒に渡します。

ただし、データベース接続自体は、他の方法で取得する必要があります。いくつかの PHP フレームワークとそれらがこの問題をどのように解決するかをよく調べるか、 Singleton、Registry Pattern、または Dependency Injection Container などの設計パターンを読んでください。

于 2013-06-17T08:45:29.090 に答える