【问题标题】:How to retrieve information using PDO method [duplicate]如何使用 PDO 方法检索信息 [重复]
【发布时间】:2013-04-23 00:20:59
【问题描述】:

我正在使用 PDO 方法构建登录脚本。我想从用户帐户注册一些会话。每次我尝试从数据库中提取信息时,我都会变得空白。我是 PDO 的新手。这是我目前所拥有的:

try{
$conn = new PDO(...........);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$conn->exec("SET CHARACTER SET utf8");

$sql = "SELECT * FROM $table WHERE USER = ':user' AND pass = ':pass'";

$UpdateSql = $conn->prepare($sql);
$UpdateSql->bindValue(':user',$user,PDO::PARAM_STR);
$UpdateSql->bindValue(':pass',$pass,PDO::PARAM_STR);

$results = $UpdateSql->execute();

/*Here is where the error comes in
foreach($results as $row)
{
$_SESSION['account'] = $row['account'];
}
*/

/*I also tried this
foreach($UpdateSql as $row)
{
$_SESSION['account'] = $row['account'];
}
*/

}catch(PDOException $e){
echo $e->getMessage();
}

当我尝试第一个 foreach() 时,我收到一个错误 警告:在第 26 行的 C:\xampp\htdocs\drug_center\dc_login.php 中为 foreach() 提供的参数无效 和第二个foreach() 给了我一个空的结果。有人可以向我解释我在哪里犯了错误吗?

【问题讨论】:

  • 使用foreach($UpdateSql->fetchAll() as $row)while($row = $UpdateSql->fetch())execute() 的返回只是一个布尔值,表示一切是否正常。另外,严格来说你不应该引用你的参数(':user' 应该是:user)。
  • @Wrikken 当我不引用我的参数时收到以下错误 警告:PDO::query() [pdo.query]: SQLSTATE[42000]: 语法错误或访问冲突: 1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 19 行 C:\xampp\htdocs\drug_center\dc_login.php 的第 1 行的 ':user AND pass = :pass' 附近使用正确的语法 致命错误:调用第 21 行 C:\xampp\htdocs\drug_center\dc_login.php 中非对象的成员函数 bindValue()
  • @Brian:好吧。这是正确的。我说你应该在上面的->prepare() 声明中这样做。不是->query()。这是两个不同的东西,非常不同。
  • @Wrikken 请解释......
  • prepare() 方法准备 sql 语句,您可以使用 execute() 甚至多次使用不同的变量执行该语句。使用query(),您只需直接查询数据库即可。

标签: php mysql pdo


【解决方案1】:

您将需要$UpdateSql->fetchAll() 方法。这将为您提供一个可以遍历的结果集。

其次,您将通过 bindValue 指定参数,因此您不需要在值周围使用 '。

$table = (in_array($table, array('table1','table2')) ? $table : false;
//make sure you put some input-validation on the $table variabel!!

if($table){
  $sql = "SELECT * FROM $table WHERE user = :user AND pass = :pass";
  //lose the ' around the :pass


  $UpdateSql = $conn->prepare($sql);
  $UpdateSql->bindValue(':user',$user,PDO::PARAM_STR);
  $UpdateSql->bindValue(':pass',$pass,PDO::PARAM_STR);

  $UpdateSql->execute();
  foreach($UpdateSql->fetchAll() AS $row){
    // do some magic
  }
}else{
  throw new Exception("Error: table not allowed", 1);
}

【讨论】:

  • woot .. 为我节省了一行 .. 减少代码 = 好。
  • 我正在使用它,它给了我一个空的结果。
  • @Bryan 确保 $table$user$pass 具有值。
  • @stUrb 是的,它们都有价值。我已经确保了。
  • 查看我的更新答案。
【解决方案2】:

Execute是在SQL Server上运行一个存储过程,可以

$results = $UpdateSql->fetchAll($sql);
foreach ($results as $row) 
     //stuff
}

【讨论】:

  • Eeuh,你需要运行 ->execute() 否则准备好的语句将不会被执行。
【解决方案3】:

函数prepare()返回一个PDOStatement类的对象。正如 PHP 手册中所说,PDOStatement::execute() 不返回结果,而是返回一个布尔值来指示查询是否成功。您需要使用 PDOStatement 中的fetch commands

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2013-07-06
    相关资源
    最近更新 更多