PHP -硬编码查询在phpMyAdmin上工作,但当我通过浏览器调用php文件时则不行[重复]

zaqlnxep  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(85)

此问题已在此处有答案

How can I prevent SQL injection in PHP?(27个回答)
2天前关闭。
我在ExtJS 4的帮助下使用PHP,根据用户输入的登录凭证查询数据库。在ExtJS部分,我有一个存储,我设置了额外的参数并调用load。加载后,我检查存储计数,以查看查询是否返回了一个值,该值将确定用户是否传递了有效的登录凭据。
当我只是简单地从一个工作的php从另一个文件复制粘贴的代码时,我惊讶地挣扎着使这个工作。起初我以为我没有正确地传递值,但是在将传递的值附加到消息之后,它表明我正在完美地传递值。
接下来我试着通过localhost:8888/../../../../../readUser.php从浏览器调用php文件,我做了一个if else块,如果没有提供登录凭证(电子邮件和密码),代码将转到else块。在if-else块中,我对电子邮件和密码进行了硬编码,以查看它是否会返回任何内容。然而,在调用php文件时,我仍然没有得到任何东西。
下面是我的readUser.php文件:

<?php
require_once('../../db_mysqli.php');
require_once '../../lib/response.php';
require_once '../../lib/request.php';

class user{ 
    var $user_id;
    var $first_name;
    var $last_name;
    var $sex;
    var $birth_date;
    var $email;
    var $password;
}

$res = new Response();
$res->message = "Message Start. ";

if(isset($_GET['email'])){
    //this is the part if the email param is set    
}
else{
    $res->message.= " \n nothing received. ";

    $query = "SELECT * FROM user_details 
                WHERE email = '[email protected]' AND password = '123'";

    $result = mysql_query($query);
                
    $res->message.= " \n query =  ";
    $res->message.= $query;

    $res->message.= " \n result =  ";
    $res->message.= $result;
}

$query_array=array();
$i=0;

//Iterate all Select
while($row = mysql_fetch_array($result)){
    //Create New User instance
    $inputData = new user();
    //Fetch User Info
    $res->message.= " \n user id = ";

    $inputData->user_id=$row['user_id'];        
    $inputData->first_name=$row['first_name'];
    $inputData->last_name=$row['last_name'];
    $inputData->sex=$row['sex'];
    $inputData->birth_date['birth_date'];
    $inputData->email=$row['email'];
    $inputData->password=$row['password'];

    //Add User to ARRAY
    $query_array[$i]=$inputData;
    $i++;
}
mysql_close($con);

//Creating Json Array needed for Extjs Proxy
$res->success = true;
// $res->message = "Loaded read data";
$res->total = $total;
$res->data = $query_array;
//Printing json ARRAY
print_r($res->to_json());
?>

当我从浏览器调用这个函数时,得到的结果是:

{"success":true,"message":"Message Start. \n nothing received. \n query = SELECT * FROM user_details \n\t\t\t\tWHERE email = '[email protected]' AND password = '123' \n result = ","total":null,"data":[]}

我复制了它在phpMyAdmin上使用的查询(在删除特殊/转义字符之后),它返回了我想要的正确行。
我在while循环中也有一个消息部分,在那里我循环遍历行并将它们附加到结果中。然而,pat $res->message.= " \n user id = ";没有出现,我给我的印象是我的变量$result是null或空的,这就是为什么它根本不工作。
接下来我可以尝试什么?

xmakbtuz

xmakbtuz1#

下面是正确的编码方式。

// This is the best way to perform an SQL query
$query = sprintf("SELECT * FROM user_details
    WHERE email='%s' AND password='%s'",
    mysql_real_escape_string($email),
    mysql_real_escape_string($password));

// Perform Query
$result = mysql_query($query);

这是有效的。所以$result将有一个资源。通过给出var_dump($result);作为@Darren提到的下一行来检查这一点。
[* 请确保在运行查询之前正确建立连接。*]

相关问题