【问题标题】:Cant get data from table using PHP/PDO无法使用 PHP/PDO 从表中获取数据
【发布时间】:2013-01-06 17:53:41
【问题描述】:

我试图从我的表中检索数据只是出于某种原因我收到一个语法错误...

谁能看出我哪里出错了?

    $cid = $_GET['id']; 

    $username = 'liam';
    $password ='';  

try {
$conn = new PDO('mysql:host=localhost;dbname=', $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conn->query('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);

foreach($data as $row) {


    print_r($row). '<br />';
}

错误

 ERROR: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':cid' at line 1 

【问题讨论】:

  • 如果您能发布您收到的确切错误消息将会很有帮助。
  • 抱歉,更新了我的问题
  • @Liam,就像我说的,确保 WHERE ID = :cid' 不是 WHERE id = :cid'
  • 您似乎也没有在新的 PDO stmt 中命名数据库

标签: php mysql pdo


【解决方案1】:
$data = $conn->query('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);

查询数据库前必须绑定变量...

看看手册上的例子http://php.net/manual/en/pdostatement.bindparam.php

【讨论】:

    【解决方案2】:

    您正在运行查询而不是准备它。

    改变

    $conn->query
    

    $conn->prepare
    

    query() 只是按原样运行给定的查询。 prepare() 将准备好的语句发送到您的数据库,之后可以使用绑定参数运行它。

    我还看到您正在使用带有 PDO 的 MySQL 驱动程序。使用 MySQL 时,您必须禁用模拟的预处理语句:

    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    

    欲了解更多信息,请参阅:How can I prevent SQL injection in PHP?

    【讨论】:

      【解决方案3】:

      试试这个:

      $data = $conn->prepare('SELECT * FROM directory WHERE ID = :cid');
      $data->bindValue(":cid", $cid);
      

      注意使用prepare() 而不是query()

      【讨论】:

        【解决方案4】:
        define('DB_SERVER', 'localhost');
        define('DB_USERNAME', 'root');
        define('DB_PASSWORD', '');
        define('DB_CHARSET', 'UTF-8');
        define('DB_DATABASE', 'database');
        define('PDO_DSN', 'mysql:host=' . DB_SERVER . ';dbname=' . DB_DATABASE . ';charset=' .
        DB_CHARSET);
        
        try {
        
        $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND 
        => "SET NAMES UTF8"));
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        /*** echo a message saying we have connected ***/
        
        }
        catch(PDOException $e)
        {
        echo $e->getMessage();
        }
        

        确保表格中的 ID 是大写字母!!

        $data = $db->prepare('SELECT * FROM directory WHERE ID = :cid');
        

        也许在这里我会使用 bindParam 而不是 bindValue()

        $data->bindValue(':cid', $cid);
        $data->execute();
        $result = $data->fetchAll();
        
        foreach($result as $row) {
        
        
        print_r($row). '<br />';
        }
        

        【讨论】:

        • 如果他的表中的字段不是大写ID怎么办?只是想知道为什么它必须在首都..
        • @dbf,WHERE ID = 1 和 WHERE id = 1 是有区别的
        • 是的,区别是一个是大写的,另一个不是,我的问题是为什么这很重要..
        【解决方案5】:

        我没有在您的连接行中看到数据库名称,也没有在您的脚本中看到use 子句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-16
          • 2018-11-25
          • 2017-11-03
          • 2013-10-14
          • 1970-01-01
          • 2015-08-28
          相关资源
          最近更新 更多