Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将mysql转换为PDO语句_Php_Mysql_Pdo - Fatal编程技术网

Php 将mysql转换为PDO语句

Php 将mysql转换为PDO语句,php,mysql,pdo,Php,Mysql,Pdo,这是用MySQL方式编写的登录函数 然而,当它转换为PDO方式时,存在问题 MYSQL: <? function confirmUser($username, $password){ global $conn; if(!get_magic_quotes_gpc()) { $username = addslashes($username); } /* Verify that user is in database */ $q = "select

这是用MySQL方式编写的登录函数 然而,当它转换为PDO方式时,存在问题

MYSQL:

    <?
function confirmUser($username, $password){
   global $conn;
   if(!get_magic_quotes_gpc()) {
    $username = addslashes($username);
   }

   /* Verify that user is in database */
   $q = "select UserID,UserPW from user where UserID  = '$username'";
   $result = mysql_query($q,$conn);
   if(!$result || (mysql_numrows($result) < 1)){
      return 1; //Indicates username failure
   }

   /* Retrieve password from result, strip slashes */
   $dbarray = mysql_fetch_array($result);
   $dbarray['UserPW']  = stripslashes($dbarray['UserPW']);
   $password = stripslashes($password);

   /* Validate that password is correct */
   if($password == $dbarray['UserPW']){
      return 0; //Success! Username and password confirmed
   }
   else{
      return 2; //Indicates password failure
   }
}

除了在函数中使用
全局
包含
(您应该研究另一种构造函数的方法,而不是这样做),我将更改代码如下:

$sql =
    'SELECT  id
    FROM     user
    WHERE    UserID = ?
    AND      UserPW = ?
    LIMIT 1';

$stmt = $conn->prepare($sql);
$stmt->execute(array(
    '09185346d',
    'asdasdsa'
));

if ($stmt->rowCount() == 1) {
    return 0;
}
else {
    return 1;
}
梳理查询以给出一般身份验证错误,而不是允许人们先试用有效用户名,然后试用有效密码,然后使用PDO语句
rowCount
方法查看是否返回了您的行

为了回答第二部分的问题,没有必要专门使用
bindParam
来防止SQL注入

下面是一个关于
bindParam
bindValue

$param = 1;

$sql = 'SELECT id FROM myTable WHERE myValue = :param';
$stmt = $conn->prepare($sql);
$stmt->bindValue(':param', $param);
$param = 2;
$stmt->execute();
使用
bindParam

$stmt->bindParam(':param', $param);
$param = 2;
$stmt->execute();
从myValue='2'的myTable中选择id

使用
bindValue

$param = 1;

$sql = 'SELECT id FROM myTable WHERE myValue = :param';
$stmt = $conn->prepare($sql);
$stmt->bindValue(':param', $param);
$param = 2;
$stmt->execute();

从myValue='1'

的myTable中选择id,除了使用
global
和函数中的
include
(您应该研究另一种构造函数的方法,而不是这样做),我将按如下方式更改代码:

$sql =
    'SELECT  id
    FROM     user
    WHERE    UserID = ?
    AND      UserPW = ?
    LIMIT 1';

$stmt = $conn->prepare($sql);
$stmt->execute(array(
    '09185346d',
    'asdasdsa'
));

if ($stmt->rowCount() == 1) {
    return 0;
}
else {
    return 1;
}
梳理查询以给出一般身份验证错误,而不是允许人们先试用有效用户名,然后试用有效密码,然后使用PDO语句
rowCount
方法查看是否返回了您的行

为了回答第二部分的问题,没有必要专门使用
bindParam
来防止SQL注入

下面是一个关于
bindParam
bindValue

$param = 1;

$sql = 'SELECT id FROM myTable WHERE myValue = :param';
$stmt = $conn->prepare($sql);
$stmt->bindValue(':param', $param);
$param = 2;
$stmt->execute();
使用
bindParam

$stmt->bindParam(':param', $param);
$param = 2;
$stmt->execute();
从myValue='2'的myTable中选择id

使用
bindValue

$param = 1;

$sql = 'SELECT id FROM myTable WHERE myValue = :param';
$stmt = $conn->prepare($sql);
$stmt->bindValue(':param', $param);
$param = 2;
$stmt->execute();

从myValue='1'的myTable中选择id

您的问题到底是什么?错误消息?意外的行为?自燃?给我们一些可以在这里使用的东西。很抱歉,问题是,无论密码不正确或用户名不存在,它都将落入返回0。区分“用户名失败”和“密码失败”是不好的做法,因为它允许人们在测试有效密码之前测试有效用户名。结合您的查询,仅出现“身份验证失败”。-此外,在您的代码中,提供的密码甚至不必属于正确的用户,任何用户名和密码都允许您进行身份验证,只要它们位于数据库中的某个位置。我在COALESCE(id,0)运行时发现它是错误的。您到底出了什么问题?错误消息?意外的行为?自燃?给我们一些可以在这里使用的东西。很抱歉,问题是,无论密码不正确或用户名不存在,它都将落入返回0。区分“用户名失败”和“密码失败”是不好的做法,因为它允许人们在测试有效密码之前测试有效用户名。结合您的查询,仅出现“身份验证失败”。-此外,在您的代码中,提供的密码甚至不必属于正确的用户,任何用户名和密码都允许您进行身份验证,只要它们在数据库中的某个位置。我在合并(id,0)时发现它是错误的准备好的语句的全部目的是1)通过缓存服务器查询分析来加速重复查询,2)将变量参数从查询主体中分离出来以防止SQL注入之类的事情。不必显式使用
bindParam
来防止SQL注入
bindParam
将对变量的引用绑定到准备好的查询中,该查询在调用
execute
时进行计算,当您明确希望对要绑定的参数进行类型转换时,该查询非常有用
bindValue
相同,但会立即计算绑定参数。您不必使用它们。准备好的语句的全部目的是1)通过缓存服务器查询分析来加速重复查询,2)将变量参数与查询体分离以防止SQL注入之类的事情。不必显式使用
bindParam
来防止SQL注入
bindParam
将对变量的引用绑定到准备好的查询中,该查询在调用
execute
时进行计算,当您明确希望对要绑定的参数进行类型转换时,该查询非常有用
bindValue
相同,但会立即计算绑定参数。你不必使用它们。