Php 更改简单数据库类以支持准备好的语句

Php 更改简单数据库类以支持准备好的语句,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我的问题是关于我的代码。 我已经创建了2个网站。但是它在mysqli-PHP-OOP上。有人告诉我这些查询是SQL注入。所以,我想改变我的数据库结构来准备语句。然后,我可以从SQL注入中保存我的网站。为此,我需要你的帮助。 以下是我的数据库结构: config.php Database.php 我的问题是这样写的: 嘿,你的常识兄弟!请参见此屏幕截图: 因此,请检查我的数据库结构和查询,并告诉我如何更改数据库结构以准备语句,以及如何防止SQL注入。请帮帮我。我发现你们班上的不同方法是多余的。他们

我的问题是关于我的代码。 我已经创建了2个网站。但是它在mysqli-PHP-OOP上。有人告诉我这些查询是SQL注入。所以,我想改变我的数据库结构来准备语句。然后,我可以从SQL注入中保存我的网站。为此,我需要你的帮助。 以下是我的数据库结构: config.php

Database.php

我的问题是这样写的:

嘿,你的常识兄弟!请参见此屏幕截图:
因此,请检查我的数据库结构和查询,并告诉我如何更改数据库结构以准备语句,以及如何防止SQL注入。请帮帮我。

我发现你们班上的不同方法是多余的。他们都做同样的事情,但只是名字不同而已。首先,让我们删除除一个方法之外的所有方法。我还将从类中删除一些其他cargo cult代码

然后,您将需要重写以添加错误报告和字符集支持。添加define'DB_字符集','utf8mb4';您的配置文件

然后您必须重写这个类中剩下的唯一方法,以便添加对准备语句的支持。有关详细信息,请参阅我的文章

Class Database {

    public $link;

    public function __construct() {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        try {
            $this->link = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        mysqli_set_charset($this->link, DB_CHARSET);
        } catch (\mysqli_sql_exception $e) {
            throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
        }
    }

    public function query($sql, $params = [], $types = "")
    {
        if ($params) {
            $types = $types ?: str_repeat("s", count($params));
            $stmt = $this->link->prepare($sql);
            $stmt->bind_param($types, ...$params);
            $stmt->execute();
            return $stmt->get_result();
        } else {
            return $this->link->query($sql);
        }
    }
}
现在,您可以将类用于任何类型的查询,这些查询利用准备好的语句

$query = "INSERT INTO users(name) VALUES(?)";
$this->db->query($query, [$data['name']]);
header("Location: index.php");

$query = "SELECT * FROM users WHERE user_id = ?";
$result = $this->db->query($query, [$user_id]);
$value = $result->fetch_assoc();
$name = $value['name'];

$this->db->query("DELETE FROM users WHERE user_id = ?",[$dlt_user]);
header("location: rd-user.php");

$query = "UPDATE users SET name = ? WHERE user_id = ?";
$this->db->query($query,[$name,$userid]);
header("Location: index.php");

顺便说一句,这不是你的数据库结构,请访问该链接,它非常有用。它不是我自己创建的,但我的意思是我正在使用该BTW,哪个链接?我们可以使用mysqli\u real\u escape\u字符串吗?要创建这样的变量:$name=mysqli\u real\u escape\u string$this->db->link,$data['name'];或者如果我们使用prepare语句,那么我们只需要像这样使用:$name=$data['name']?兄弟,你的密码给了我很多错误。请检查屏幕截图,我已经用错误的屏幕截图更新了我的问题。Zain,在不了解代码如何工作的情况下复制代码会导致灾难。在本例中,YCS只做了一个小的打字错误,如果您试图理解代码,这将很容易修复。只需将所有出现的$mysqli替换为$this->linkworked,但是如果我没有在SELECT查询中使用WHERE条件,因为查询$sql$param需要2个参数,但是如果我需要除WHERE之外的所有数据,那么我们在查询中不需要$params,那么我能做什么呢?
<?php
    $filepath = realpath(dirname(__FILE__));
    include_once ($filepath.'/../lib/Database.php');
?>

$name = mysqli_real_escape_string($this->db->link, $data['name']);
$query = "INSERT INTO users(name) VALUES('$name')";
$result = $this->db->insert($query);
if($result != false){
    header("Location: index.php");
}

$query = "SELECT * FROM users WHERE user_id = '$user_id'";
$result = $this->db->select($query);
$value = $result->fetch_assoc();
$name = $value['name'];

$query = "DELETE FROM users WHERE user_id = '$dlt_user'";
$result = $this->db->delete($query);
if($result){
    header("location: rd-user.php");
}

$query = "UPDATE users SET name = '$name' WHERE user_id = '$userid'";
$result = $this->db->update($query);
if ($result){
    header("Location: index.php");
}
Class Database {

    public $link;

    public function __construct() {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        try {
            $this->link = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        mysqli_set_charset($this->link, DB_CHARSET);
        } catch (\mysqli_sql_exception $e) {
            throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
        }
    }

    public function query($sql, $params = [], $types = "")
    {
        if ($params) {
            $types = $types ?: str_repeat("s", count($params));
            $stmt = $this->link->prepare($sql);
            $stmt->bind_param($types, ...$params);
            $stmt->execute();
            return $stmt->get_result();
        } else {
            return $this->link->query($sql);
        }
    }
}
$query = "INSERT INTO users(name) VALUES(?)";
$this->db->query($query, [$data['name']]);
header("Location: index.php");

$query = "SELECT * FROM users WHERE user_id = ?";
$result = $this->db->query($query, [$user_id]);
$value = $result->fetch_assoc();
$name = $value['name'];

$this->db->query("DELETE FROM users WHERE user_id = ?",[$dlt_user]);
header("location: rd-user.php");

$query = "UPDATE users SET name = ? WHERE user_id = ?";
$this->db->query($query,[$name,$userid]);
header("Location: index.php");