-2
<?php
$config['db'] = array (
'host'                      =>  'localhost',
'username'                  =>  'root',
'password'                  =>  '',
'dbname'                    =>  'pdologin'
);

$db = new PDO("mysql:host={$config['db']['host']};dbname={$config['db']['dbname']}",
      $config['db']['username'], $config['db']['password']);
$query = $db->query("SELECT * 'firstname' FROM 'login'");
while ($row = $query->fetch(PDO::FETCH_ASSOC)){
echo $row['firstname'], '<br>';
 }
?>

当我运行代码时,我收到错误“致命错误:在第 12 行的 C:\webroot\wamp\www\index.php 中的非对象上调用成员函数 fetch()”。

是什么让它出错?我唯一能想到的就是 SQL 查询。

4

1 回答 1

0

此 SQL 查询中有两个语法错误:

$query = $db->query("SELECT * 'firstname' FROM 'login'");

您不能将字符串文字用作 FROM 子句中的表。

说明:不同类型的引号在 SQL 中做不同的事情。

  • 单引号始终是字符串文字或日期文字的分隔符。
  • 在 MySQL 中,反引号是表标识符(以及列和其他元数据对象)的分隔符。
  • 双引号是标准 SQL 中表标识符的分隔符,如果您设置SQL_MODE=ANSI_QUOTES ,则在 MySQL 中。但默认情况下,在 MySQL 中,双引号与单引号相同,用于分隔字符串和日期。

'firstname'的查询中还有一个无效的地方。我不知道您是否打算为列命名(如果是这样,您又把引用类型弄错了),或者您是否打算将它作为列别名(如果是这样,您不能 alias *,您只能别名单个特定列)。

所以你的查询应该是这样的:

$query = $db->query("SELECT * FROM `login`");

$query脚本中的另一个错误是,在调用 PDOStatement 方法之前,您没有验证它是 PDOStatement 类型的对象。false如果 SQL 中有错误, PDO::query() 将返回。false是原始值,而不是对象,所以它自然不会有任何可以调用的方法。因此,在对它进行任何其他操作之前,您总是必须检查返回值。

例如:

$query = $db->query("SELECT * FROM `login`");
if ($query === false) {
  die(print_r($db->errorInfo(), true));
}
于 2013-01-16T03:24:55.350 回答