0

PDO をいじり始めたばかりで、特定のテーブル名のすべてのデータを表示する関数を作成しようとしています。ここでいくつかの投稿を読んだ後、私は作業を開始できる解決策を見つけました (ハードコーディングされた select ステートメントを以下に示します)。ただし、フィールド名をバインドすると、execute ステートメントが機能しません (Undefined index: person_id のような例外が発生します)。クラスが PDO を拡張していることに言及する必要があります。

 /*********************************************************************
 *Function  showTable
 *Purpose   Display all information for a given table.
 *Params    $sTable -> Table name
 ********************************************************************/
public function showTable($sTable)
{
    $result;

    try
    {
        if(isset($sTable))
        {
            //create a result in a table format
            $result = "<table>";
            //$stmt = $this->prepare('DESCRIBE :sTable');
            $stmt = $this->prepare('DESCRIBE ' . $sTable);

            //$stmt->bindParam(':sTable', $sTable); 
            $stmt->execute();

            //array version of the column names
            $aCols = $stmt->fetchAll(PDO::FETCH_COLUMN);
            //string version of the column names
            $sCols = implode (", ", $aCols);

            //$stmt = $this->prepare('SELECT :fields FROM :sTable');
            //$stmt = $this->prepare('SELECT :fields FROM person');
            $stmt = $this->prepare('SELECT person_id, first_name, last_name FROM person');

            //$stmt->execute(array(':fields'=>$sCols, 'stable'=>$sTable));
            //$stmt->execute(array(':fields'=>$sCols));
            $stmt->execute();

            while($row = $stmt->fetch(PDO::FETCH_ASSOC))
            {
                var_dump($row);
                $result = $result . "<tr>";
                foreach($aCols as $col)
                {
                    //var_dump($row);
                    $result = $result . " <td>" . $row[$col]. "</td>";
                }
                $result = $result . "</tr>";
            }
            $result = $result . "</table>";
        }
        return $result;
    }
    catch(PDOException $e)
    {
        if($this->bDebug)
        {
            echo $e->getMessage();
        }
    }
}

私が言ったように、ハードコードされた選択文字列は機能しますが、ハードコードされたものをコメントアウトし、バインドで実行のコメントを外すと、例外がスローされます。

4

1 に答える 1

1

この方法では識別子やキーワードを挿入できません。

PDOStatement::execute() は、単一引用符内にエスケープされた形式で値を配置します。クエリは次のようになります。

SELECT 'col1, col2' FROM person

無効な MySQL 構文とは。

有効な例:

$stmt = $this->prepare('SELECT col FROM person WHERE name = :name');
$stmt->execute(array(':name' => $name));

ここに挿入する値であるため、機能します。キーワードや識別子ではありません。

于 2013-08-28T01:24:54.810 に答える