【问题标题】:PHP - (PDO) Execute with binding variablesPHP - (PDO) 使用绑定变量执行
【发布时间】:2013-08-30 22:31:32
【问题描述】:

我刚开始使用 PDO,我正在尝试创建一个函数来显示给定表名的所有数据。在这里阅读了几篇文章后,我找到了一个可以开始工作的解决方案(如下所示,带有硬编码的 select 语句)。但是,当我绑定我的字段名称时,我无法让我的执行语句工作(我得到一个类似于:未定义索引: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();
        }
    }
}

就像我说的硬编码选择字符串有效,但是当我注释掉硬编码并取消注释执行绑定时,它会抛出异常。

【问题讨论】:

    标签: php mysql pdo execute


    【解决方案1】:

    您不能以这种方式插入标识符或关键字。

    PDOStatement::execute() 会将转义形式的值放在单引号内。您的查询如下所示:

    SELECT 'col1, col2' FROM person
    

    什么是无效的 MySQL 语法。

    一个有效的例子:

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

    它有效,因为它是您在此处插入的值;而不是关键字或标识符。

    【讨论】:

    • 哦,我现在明白了。非常感谢。我会尽快设置为接受的答案。
    • 有了这些信息,我得到了我想要的工作方式,再次感谢
    猜你喜欢
    • 2018-12-11
    • 2017-08-07
    • 2017-02-24
    • 2011-06-08
    • 2020-07-31
    • 2019-09-16
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多