Php 对PDO的MySQL查询

Php 对PDO的MySQL查询,php,mysql,pdo,Php,Mysql,Pdo,我正在从MySQL切换到PDO,我不确定这个查询是否正确。。我仍然需要编写if命令 public function User_Login($_iUsername,$_iPassword) { $username=mysql_real_escape_string($_iUsername); $password=mysql_real_escape_string($password); $md5_password=md5($_iPassword); $query=mys

我正在从MySQL切换到PDO,我不确定这个查询是否正确。。我仍然需要编写if命令

public function User_Login($_iUsername,$_iPassword) {
    $username=mysql_real_escape_string($_iUsername);
    $password=mysql_real_escape_string($password);
    $md5_password=md5($_iPassword);
    $query=mysql_query("SELECT _iD FROM users WHERE _iUsername='$_iUsername' and _iPassword='$md5_password' AND _iStatus='1'");
    if( mysql_num_rows( $query ) == 1 ) {
        $row = mysql_fetch_array( $query );
        return $row['_iD'];
    } else {
        return false;
    }
}


首先,您没有正确地参数化查询。使用PDO很好,但更改的主要目的之一是能够参数化查询。其次,
md5
是一个非常弱的散列。我建议改用bcrypt。最后,
PDOStatement::rowCount
是您要寻找的方法

$sth = $db->prepare("SELECT _ID FROM users WHERE _iUsername = ?
    AND _iPassword = ? AND _iStatus = 1");
$sth->execute(array($_iUsername, $md5_password));
if ($sth->rowCount() == 1) {
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    return $row['_iD'];
}
else {
    return false;
}

参数化查询是有利的,因为它可以防止SQL注入攻击。我同意爆炸药丸,但我想我会发布一个小建议-如果您只需要一行和一个值,我不明白为什么您要尝试获取一个数组,然后解析它。只需使用
fetchColumn()
execute
s参数应该是一个数组
numRows
应该是
rowCount
,没有叫做
FETCH\u ARRAY
@JordanDoyle的常量已经纠正了其他的,但是更新了
FETCH\u ARRAY
谢谢你们的回复,伙计们,“WHERE\u sername=”旁边的问号是什么。
$sth = $db->prepare("SELECT _ID FROM users WHERE _iUsername = ?
    AND _iPassword = ? AND _iStatus = 1");
$sth->execute(array($_iUsername, $md5_password));
if ($sth->rowCount() == 1) {
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    return $row['_iD'];
}
else {
    return false;
}