1

mysql関数を関数に変更mysqliしていて、興味深い問題に遭遇しました。

特定のユーザー データをエコーアウトしたい。複数の引数 (各引数はデータベース内の列を表す) を挿入する関数を作成し、単純なコード行で必要な列をエコーし​​ます。

以下の私のコードは、私が今言ったことが混乱している場合、さらに説明します. それはその全体にあります。

私の問題は、それが機能していないことです。

Notice: Undefined index: last_name in...コードの最後の行で発生するというエラーが返されますecho $user_data['last_name'];

エラーの原因は何ですか? 機能ですか?もしそうなら、どこに問題がありますか?と一緒に仕事をするのは今日が初めてmysqliです。

$mysqli = new mysqli("localhost", "user", "password", "database");

関数は次のとおりです。

function user_data ($mysqli, $user_id) {
    $data = array();
    $user_id = (int)$user_id;
    $func_num_args = func_num_args();
    $func_get_args = func_get_args();
    if ($func_num_args > 1) {
        unset($func_get_args[0]);
        unset($func_get_args[1]);
        $fields ='`' .  implode ('`, `', $func_get_args) . '`';
        //here I am starting the mysqli prepared statement              
        if ($stmt = $mysqli->prepare("SELECT ? FROM `users` WHERE `user_id` = ?")) {
            $stmt->bind_param('si', $fields, $user_id);
            $stmt->execute();
            //here I am trying to convert the result into an array
            $meta = $stmt->result_metadata();
            while ($field = $meta->fetch_field()) {
                $parameters[] = &$row[$field->name];
            }
            call_user_func_array(array($stmt, 'bind_result'), $parameters);
            while ($stmt->fetch()) {
                foreach($row as $key => $val) {
                        $x[$key] = $val;
                }
                $results[] = $x;
            }
            return $results;
            $stmt->close(); 
            }
    }
}

関数をテストして、機能するかどうかを確認します。

$session_user_id = 1;
$user_data = user_data($mysqli, $session_user_id, 'username', 'password', 'first_name', 'last_name', 'email');
echo $user_data['last_name'];

var_dump()変数の A$user_dataがこれで返されます。

array(1) { [0]=> array(1) { ["?"]=> string(58) "`username`, `password`, `first_name`, 
`last_name`, `email`" } } 
4

1 に答える 1

3

テーブルまたは列の名前?に inを使用することはできません。ドキュメントを参照してくださいprepare

代わりに、次のような配列を作成します

$valid = array('username', 'password', ...);

次に、次の方法で入力を確認しますin_array

$fields = array();
foreach($func_get_args as $arg) {
    if(in_array($arg, $valid)) $fields[] = $arg;
}
$fields = '`' . implode ('`, `', $fields) . '`';
if($stmt = $mysqli->prepare("SELECT $fields FROM `users` WHERE `user_id` = ?")) {
    // ...
于 2012-09-02T19:18:31.400 に答える