0

ここで答えられる質問がたくさんありますが、私の何が悪いのかわかりません。

プロパティとして格納されているmysqliを使用するDBクラス。準備、バインド、および実行は、マジックコールメソッドでトリガーされます。

public static function __callStatic($name, $arg)
{
    echo '<pre>';
    var_dump($arg);
    echo '</pre>';
    if($name == 'Prepare'){
        self::$Stmt = self::$mysqli->prepare(implode(', ', $arg));
        $return = self::$Stmt;
    }elseif($name == 'Bind')
        $return = self::$Stmt->bind_param(implode(', ', $arg));
    elseif($name == 'Execute')
        $return = self::$Stmt->execute();
    else
        $return = self::$mysqli->$name(implode(', ', $arg));
    if(!self::GetErr())
        return $return;
}

また、SQLステートメントを生成するクラスがあります。これは、prepareステートメントで使用される出力です。

INSERT INTO account (UName, FName, LName, Email, Password, RecQuestion, RecAnswer, Admin) VALUES (?, ?, ?, ?, ?, ?, ?, ?) 

コードは次のとおりです。

DB::Prepare(SQL::Table('account')->Insert([
    'UName' => '?',
    'FName' => '?',
    'LName' => '?',
    'Email' => '?',
    'Password' => '?',
    'RecQuestion' => '?',
    'RecAnswer' => '?',
    'Admin' => '?'
]));
DB::Bind('sssssssi', $userName, $fName, $lName, $email, $password, $recQ, $recA, $admin);
DB::Execute();

ご覧のとおり、8つのタイプと8つの値があります...

var_dump($arg)DB::Bindが呼び出されたときのforの出力もここにあります

array(9) {
  [0]=>
  string(8) "sssssssi"
  [1]=>
  string(4) "user"
  [2]=>
  string(5) "first"
  [3]=>
  string(4) "last"
  [4]=>
  string(15) "email@email.com"
  [5]=>
  string(64) "$2a$10$Tw4eOkUYA6SX8WP8XJfKZeFfOM9htVRJyP0d1iYlka0jNCV/qPGzazakT"
  [6]=>
  string(7) "recover"
  [7]=>
  string(64) "$2a$10$LrfK2EdkRi6pPdx1tUtPWe8p24T8ISdQHYhW0N06RjbvCrU4Flqiie4jU"
  [8]=>
  int(1)
}
4

1 に答える 1

2

implode(', ', $arg)単一の文字列を返すため、1つのパラメータしか取得していませんでした。これを実行する適切な方法は、call_user_func_array();

ただし、見た目ほど明白ではありません。bind_param()議論は価値ではなく参照によって渡されることを期待しています。__callStatic($name, $arg)には値の配列があり、参照ではないため、これらの値への参照を含むローカルコピーが必要です。

解決:

elseif($name == 'Bind'){
    foreach($arg as &$v)
        $Arg[] = &$v;
    $return = call_user_func_array(array(self::$Stmt, 'bind_param'), $Arg);
}
于 2012-08-10T00:46:54.513 に答える