3

これは私の現在のデータベースクラスです:

class Database {

    private $db;

    function Connect() {
        $db_host = "localhost";
        $db_name = "database1";
        $db_user = "root";
        $db_pass = "root";
        try {
            $this->db = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user, $db_pass);
        } catch(PDOException $e) {
            die($e);
        }
    }

    public function getColumn($tableName, $unknownColumnName, $columnOneName, $columnOneValue, $columnTwoName = "1", $columnTwoValue = "1") {
        $stmt = $this->db->query("SELECT $tableName FROM $unknownColumnName WHERE $columnOneName='$columnOneValue' AND $columnTwoName='$columnTwoValue'");
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $results[0][$unknownColumnName];
    }
}

次のコードを使用して実行しようとしています。

$db = new Database();
$db->Connect();
echo $db->getColumn("Sessions", "token", "uid", 1);

そして、次のエラーが表示されます。

PHP 致命的なエラー: 19 行目の /Users/RETRACTED/RETRACTED/root/includes/Database.php の非オブジェクトに対するメンバー関数 fetchAll() の呼び出し

どうしたの?ありがとう

4

3 に答える 3

5
  1. この関数は、SQL インジェクションを起こしやすいです。
  2. この関数では、最も単純な OR 条件を使用しても列を取得できません
  3. この関数は、SQL 言語のほぼ自然な英語を読めない意味不明なものにします

ほら、あなたはまさにこの関数を書いて自分を甘やかしました。毎日のコーディングにどのように使用されると思いますか? 実際のところ、この関数を使用すると、未加工の PDO を使用する場合よりも経験が難しくなります。新しい構文、多数の例外、直前の修正をすべて学習する必要があります。

生の PDO に戻してください!

正しい道を教えてあげましょう

public function getColumn($sql, $params)
{
    $stmt = $this->db->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetchColumn();
}

このように使用

echo $db->getColumn("SELECT token FROM Sessions WHERE uid = ?", array(1));

このようにして、愚かなサブセットに限定されないSQLの全機能と、準備されたステートメントのセキュリティを使用しながら、コードを理解しやすく保つことができます.
それをまだ1行で呼び出している間-それはあなたの最初の(そして非常に適切な!)意図でした。

于 2013-08-20T05:33:40.003 に答える
1

$stmt 変数が PDOStatement オブジェクトを返していないことを意味します。PDO::query がエラー時に PDOStatement または False を返すため、クエリは失敗しています。

于 2013-08-20T03:33:12.213 に答える
0

fetch..の代わりに使用fetchAllすると、あなたの場合は簡単になります

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $results[0][$unknownColumnName];

そうなる

$results = $stmt->fetch(PDO::FETCH_ASSOC);
return $results[$unknownColumnName];
于 2015-05-12T09:53:12.927 に答える