我还是PDO的新手。需要知道将此mysqli代码替换为PDO。
public function validusername() {
$conn = new mysqli('127.0.0.1', 'root', '', 'project');
$sql = "SELECT COUNT(*) FROM `users` WHERE `username` = '$this->username'";
$result = $conn->query($sql);
return ($result->fetch_array()[0] == 1) ? true : false;
}
注意:$this->username
是一个值,来自$_POST['username']
来自public function ___contruct
的单个班级。这个mysqli将检查MySQL中是否存在用户名,如果有,则返回true。
我尝试用以下代码替换代码:
public function validusername() {
$db = new PDO('mysql:host=127.0.0.1;dbname=project', 'root', '');
$result = $db->prepare('
SELECT COUNT(*)
FROM users
WHERE username = :username
');
$result->execute(['username'=>$this->username]);
$result = $result->fetch(PDO::FETCH_ASSOC);
return ($result[0] == 1) ? true : false;
}
答案 0 :(得分:3)
我认为你需要做的就是在参数列表中正确引用参数
$result->execute(['username'=>$this->username]);
应该是
$result->execute([':username'=>$this->username]);
请注意,缺少参数数组键字段前面的:
您也没有使用任何错误检查。我更喜欢将PDO设置为抛出异常但是你不用也可以测试每个调用的结果并输出数据库错误,这样你就可以了解更多关于这个错误的信息
public function validusername() {
$db = new PDO('mysql:host=127.0.0.1;dbname=project', 'root', '');
$result = $db->prepare('
SELECT COUNT(*)
FROM users
WHERE username = :username');
if ( ! $result ) {
print_r($db->errorInfo());
exit;
}
if ( ! $result->execute(['username'=>$this->username]) ) {
print_r($db->errorInfo());
exit;
}
$result = $result->fetch(PDO::FETCH_ASSOC);
return ($result[0] == 1) ? true : false;
}
补充提示:
每次执行只连接一次数据库是正常的。您似乎正在为每种方法执行此操作。最好将$db
作为参数传递,或者更好地将$db
句柄保存为类属性并将其设置为构造函数的一部分。连接非常耗时。
答案 1 :(得分:2)
主要变化是:
使用PDO时使用DSN - DSN将包含数据库,主机名或端口(可选)
您可以在连接对象的实例上定义获取模式。
您可以轻松地将值绑定到查询以防止SQL注入
使用prepare方法创建一个语句,然后对从该返回的变量调用execute。
以下是您的代码更新,以反映上述内容:
public function validusername() {
$conn = new PDO('mysql:dbname=project;host=127.0.0.1', 'root', '');
// return all result sets as associative array
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$sql = "SELECT COUNT(`uid`) AS total FROM `users` WHERE `username` = :username";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':username', $this->username);
$stmt->execute();
$row = $stmt->fetch();
return $row['total']==1;
}
绑定变量的快速方法是:
$stmt->execute([':username'=>$this->username]);
而不是:
$stmt->bindParam(':username', $this->username);
$stmt->execute();
使用bindParam,您可以为第三个参数设置param类型(例如int或boolean)。
以下是PDO语句对象的文档,其中提供了许多文档 执行查询的其他示例:http://php.net/manual/en/pdo.prepared-statements.php