亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更改一個簡單的數據庫類以支持準備好的語句

更改一個簡單的數據庫類以支持準備好的語句

PHP
慕絲7291255 2022-01-24 10:10:38
我的問題是關于我的代碼。我創建了 2 個網站。但它在 mysqli PHP OOP 上。有人告訴我,這些查詢是 SQL 注入。所以,我想改變我的數據庫結構來準備報表。然后,我可以從 SQL 注入中保存我的網站。為此,我需要你的幫助。 這是我的數據庫結構:config.php<?phpdefine("DB_HOST", "localhost");define("DB_USER", "root");define("DB_PASS", "");define("DB_NAME", "lunch");?>數據庫.php<?php    $filepath = realpath(dirname(__FILE__));    include_once ($filepath.'/../config/config.php');?><?phpClass Database {    public $host = DB_HOST;    public $user = DB_USER;    public $pass = DB_PASS;    public $dbname = DB_NAME;    public $link;    public $error;    public function __construct() {        $this->connectDB();    }    private function connectDB() {        $this->link = new mysqli($this->host, $this->user, $this->pass, $this->dbname);        if (!$this->link) {            $this->error = "Connection fail" . $this->link->connect_error;            return false;        }    }    public function select($query) {        $result = $this->link->query($query) or                die($this->link->error . __LINE__);        if ($result->num_rows > 0) {            return $result;        } else {            return false;        }    }    public function insert($query) {        $insert_row = $this->link->query($query) or                die($this->link->error . __LINE__);        if ($insert_row) {            return $insert_row;        } else {            return false;        }    }    public function update($query) {        $update_row = $this->link->query($query) or                die($this->link->error . __LINE__);        if ($update_row) {            return $update_row;        } else {            return false;        }    }    public function delete($query) {        $delete_row = $this->link->query($query) or                die($this->link->error . __LINE__);        if ($delete_row) {            return $delete_row;        } else {            return false;        }    }}?>因此,請檢查我的數據庫結構和查詢,并告訴我如何更改我的數據庫結構以準備語句以及如何防止 SQL 注入。請幫我。
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

我發現您課堂上的不同方法非常多余。他們都做同樣的事情,而只是名稱不同。所以首先讓我們刪除除一個方法之外的所有方法。我也會從課堂上刪除一些其他貨物崇拜代碼。


然后您將需要重寫您的連接代碼以添加錯誤報告和字符集支持。也添加define('DB_CHARSET', 'utf8mb4');到您的配置文件中。


然后你必須重寫這個類中剩下的唯一方法,以添加對準備好的語句的支持。有關詳細信息,請參閱我的文章Mysqli 輔助函數。


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");


查看完整回答
反對 回復 2022-01-24
  • 1 回答
  • 0 關注
  • 157 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號