【发布时间】:2018-03-08 09:46:15
【问题描述】:
由于一个新项目的服务器需求,我已经离开了 mysqli_query()。但是,我在更新一些查询时遇到了问题。
连接文件
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'nj2kfa3j_sublift');
define('DB_USER', 'nj2kfa3j_web');
define('DB_PASS', 'prum9wR4');
define('DB_CHAR', 'utf8');
class DB
{
protected static $instance = null;
protected function __construct() {}
protected function __clone() {}
public static function instance()
{
if (self::$instance === null)
{
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => FALSE,
);
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
}
return self::$instance;
}
public static function __callStatic($method, $args)
{
return call_user_func_array(array(self::instance(), $method), $args);
}
public static function run($sql, $args = [])
{
if (!$args)
{
return self::instance()->query($sql);
}
$stmt = self::instance()->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
?>
问题查询语句:
$stmt = DB::run("SELECT * FROM admin WHERE username='$manager' AND password='$password' LIMIT 1");
$existCount = $stmt->fetchColumn();
if ($existCount == 1){
$id;
$full_name;
var_dump($stmt);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$id = $row["id"];
$full_name = $row["full_name"];
echo 'test';
}
}
我以或多或少相同的方式完成了其他查询,并且它们正在工作,如下所示:
$stmt = DB::run("SELECT * FROM categories");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
这里发生了什么?在上面的查询中 var_dump() 正在返回:
object(PDOStatement)#2 (1) { ["queryString"]=> string(81) "SELECT * FROM admin WHERE username='********' AND password='********' LIMIT 1" }
但它没有进入 while 循环并命中 echo 'test';
【问题讨论】:
-
因为
fetchColumn已经为您提取了一行。没有什么可取的了。 -
您应该使用准备好的语句,而不是存储纯文本密码。相反,请使用
password_hash()。 -
哦,好吧,这有点道理。我一直在研究一些事情,我在某处看到一些东西说 fetchColumn() 可以像 mysqli_num_rows() 一样使用来查看返回了多少行。如果我不能这样做,是否有其他方法可以确定查询是否找到了一行?
-
请使用准备好的语句
-
@PaddyHallihan 你可以使用
$existCount = $stmt->fetchall()然后使用count()查看返回的行数,然后丢掉while循环并使用foreach