0

我正在使用 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() 给了我一个空结果。有人可以向我解释我在哪里犯错吗?

4

3 回答 3

0

您将需要该$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);
}
于 2013-04-23T00:23:21.700 回答
0

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

$results = $UpdateSql->fetchAll($sql);
foreach ($results as $row) 
     //stuff
}
于 2013-04-23T00:26:52.463 回答
0

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

于 2013-04-23T00:28:16.203 回答