-1

您好,我正在尝试使用 PDO 登录,但遇到了一些问题。我总是收到 Kazkas blogai 消息。实际上,我不知道我的代码问题在哪里。以下是 PHP 代码示例:

<?php

    session_start();

    $user = "asgasgasg";
    $pass = "jhgjkghjghj";

    /* Pirmas etapas */
    if(isset($_POST['accept'])){

    try {

    $connect = new PDO('mysql:host=localhost;dbname=abba_sql', $user, $pass);
    $connect->exec("SET CHARACTER SET utf8");


    $name=$_POST['name'];
    $pass=$_POST['pass'];
    $iname=htmlspecialchars($name);
    $ipass=htmlspecialchars($pass);

    /* Antras etapas */ 
    $sql = $connect->prepare("select * from FOO WHERE name = :name AND pass = :pass");
    $sql->execute(array(':name' => $iname, ':pass' => $ipass));
    $rows = $sql->fetchAll();
    $rowcount = count($rows);

    if($rowcount > 0){
        $_SESSION['login'] = "1";
        echo 'Viskas ciki';
    }
    else 
    {
        echo 'Kazkas blogai';
    }

    $connect = null;
  }

    catch(PDOException $e) {
        echo $e->getMessage();
    }
}



    else {


?>

如果你能帮助我,我会很高兴。我正在尝试了解 PDO 基础知识。感谢您的建议和帮助。

4

1 回答 1

0

首先,我要为没有对此代码提供任何解释而道歉,我要感谢编辑我的答案的人,以便代码进入“代码块”。我通过智能手机匆忙回答了这个问题。我无法使用手机添加任何代码块或格式。

改变

$name=$_POST['name'];
$pass=$_POST['pass'];
$iname=htmlspecialchars($name);
$ipass=htmlspecialchars($pass);

$iname=$_POST['name'];
$ipass=$_POST['pass'];

但这里有一些解释:(如果你还没有弄清楚)

如果您的用户名包含一些不是字母或数字的字符并且您有一个用户名hedge&hog,那么您的示例会将值分配给 $iname hedge&amp;hog。(因为&转换为&amp;

因为您正在执行此转换,所以您的 select-statment 看起来像(已执行):

SELECT * FROM user WHERE username='hedge&amp;hog' AND password='sdf893'; //Example password

当您想要的查询是:

SELECT * FROM user WHERE username='hedge&hog' AND password='sdf893'; //Example password

出于显而易见的原因,上述查询会从您的数据库中给出不同数量的行......

函数htmlspeciarchars()主要用于输出HTML,因此它使用 html 实体(在需要时)。它不用于转义字符,我猜你的意图是。

使用准备好的语句时,您不必在将字符串插入字符串之前对其进行转义。这是因为实际查询中不包含实际值。它们只是占位符。然后 PDO(或 mysqli)通过它的函数(如 execute()、fetch() 等)处理转义。

使值占位符比不使用准备好的语句更安全:

示例: 使用准备好的语句:

SELECT * from username WHERE username=:username

没有准备好的陈述:

SELECT * from username WHERE username='hedge&hog'

如果您采用上面的第一个查询并在您的 mysql-client 中执行它,它将返回一个错误,并且 db-engine 不会处理它。如果没有数据库引擎的 som 帮助功能,它完全没用。因此,不使用任何代码就不可能进行操作。

如果您查看第二个查询,则可以单独使用 db-engine 执行和操作用户名。

因此,使用准备好的语句非常安全。

我希望这可以进一步帮助您!

于 2013-05-08T15:59:07.510 回答