1

そのため、以前行った古いチュートリアルを から に変換する作業を行っていmySQLますPDO。このようにして、概念をよりよく理解できます。しかし、私は壁にぶつかっているようです。次の関数でエラーが発生します

function user_data($user_id, $db) {
    $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]);
        $fields = '`' . implode('`, `', $func_get_args) . '`'; // !! LINE 12
        try {           
            $sql = sprintf('SELECT %s FROM members WHERE id = ?', $fields);         
            $stmt = $db->prepare($sql);
            $stmt->execute(array($user_id));
            $data = $stmt->fetch(PDO::FETCH_ASSOC);         
            return $data;           
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}

ここで関数を呼び出しています

<?php 
session_start();
require 'database/connect_db.php';
require 'functions/users.php';

if (signedIn() === true) {
    $session_id = $_SESSION['id'];
    $user_data = user_data($session_id, $db, 'email', 'password', 'role', 'name', 'company', 'title', 'phone', 'address', 'city', 'zip', 'state', 'ext', 'pic');
    echo $user_data['name'];
}

?>

これは私のエラーです

Catchable fatal error: Object of class PDO could not be converted to string in C:\xampp\htdocs\core\functions\users.php on line 12

したがって、より具体的には、上記の関数でコメントされているこの行

$fields = '`' . implode('`, `', $func_get_args) . '`';

この行がこのエラーの原因である理由がわかりません。また、それを修正する方法もわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

3

問題は、引数を文字列にfunc_get_argsフォーマットしようとするときに使用することです。$db

代わりに 3 番目の引数に配列を渡すように、コードを少し作り直しました

function user_data($user_id, $db, $select = array()) {
    if (count($select)) $fields = "`".implode('`, `', $select)."`";
    else $fields = "*";

    try {
        $stmt = $db->prepare("SELECT {$fields} FROM members WHERE id=?");              
        $stmt->execute(array($user_id));
        return $stmt->fetch(PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        die($e->getMessage());
    }
}

この関数を呼び出す方法は次のようになります。

$user_array = array('email', 'password', 'role', 'name', 'company', 'title', 'phone', 'address', 'city', 'zip', 'state', 'ext', 'pic');
$user_data = user_data($session_id, $db, $user_array);

うまくいけば、これはあなたの好みに合うでしょう!

于 2013-07-24T02:48:48.960 に答える
1

func_get_args() は、関数のすべての引数を返します。0 番目の要素を unset() しますが、args の先頭から削除する必要がある要素が2 つあります。array_slice() を使用して要素 2 から開始する例を以下に示します。

また、関数には明らかな SQL インジェクションの脆弱性があり、列名のリストを直接 SQL 選択リストに挿入します。users テーブルのすべての列のリストに対して入力を許可リストに登録して、入力に予期しないものが含まれていないことを確認する必要があります。

function user_data($user_id, PDO $db) {
    // hardcoded list of the columns in the users table; use this as an allowlist
    $all_users_columns = array('first_name', 'last_name', 'email', /* etc. */);

    $columns = array_intersect(array_slice(func_get_args(), 2),
                               $all_users_columns);

    if($columns) {
        $column_list = implode(",", 
            array_map(function($col) { return "`$col`"; }, $columns));
        try {           
            $sql = sprintf('select %s from users where user_id = ?', $column_list);          
            $stmt = $db->prepare($sql);
            $stmt->execute(array((int)$userid));
            $data = $stmt->fetch(PDO::FETCH_ASSOC);         
            return $data;           
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}
于 2013-07-24T02:55:23.087 に答える