为数据库插入函数创建一个php类

时间:2015-06-19 07:51:57

标签: php mysqli

我正在尝试创建一个类,以便在将变量发送到数据库之前节省清理变量的时间,以防止sql注入。基本系统现在正在运行,但我似乎无法实现where /或语句。有谁知道如何添加这个?

<?php

class Database {
    private $db = '';
    private $database = '';

    function __construct($settings) {
        $this->db = new mysqli('127.0.0.1', $settings['mysql_user']['username'], $settings['mysql_user']['password']);
        $this->database = $settings['mysql_user']['database'];

        print_r('Database Loaded!<br/>');
    }
    public function query($method, $database, $rows, $params, $where = array(), $or = array()) {
        $count = 0;
        $amount = count($rows);
        $final_rows = '';
        $final_data = '';
        $bind_names = array();
        $bind_names[0] = '';
        $param_types = array(
            "int" => "i",
            "string" => "s",
            "double" => "d",
            "blob" => "b"
        );

        switch($method) {
            case 'INSERT':
                foreach ($rows as $row) {
                    $count = $count + 1;
                    $final_rows .= '`' . $row . '`' . ($count != $amount ? ', ' : '');
                    $final_data .= '?' . ($count != $amount ? ', ' : '');
                }

                $stmt = $this->db->prepare('INSERT INTO `' . $this->database . '`.`' . $database . '` (' . $final_rows . ') VALUES (' . $final_data . ')');

                for ($i = 0; $i < count($params); $i++)
                {
                   $bind_name = 'bind'.$i;
                   $$bind_name = $params[$i][1];
                   $bind_names[0] .= $param_types[$params[$i][0]];
                   $bind_names[] = &$$bind_name;
                }

                call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

                return $stmt->execute();
            break;
            case 'UPDATE':
                foreach ($rows as $row) {
                    $count = $count + 1;
                    $final_rows .= '`' . $row . '`' . ($count != $amount ? ', ' : '');
                    $final_data .= '?' . ($count != $amount ? ', ' : '');
                }

                $stmt = $this->db->prepare('UPDATE `' . $this->database . '`.`' . $database . '` SET ' . $final_rows . '');

                for ($i = 0; $i < count($params); $i++)
                {
                   $bind_name = 'bind'.$i;
                   $$bind_name = $params[$i][1];
                   $bind_names[0] .= $param_types[$params[$i][0]];
                   $bind_names[] = &$$bind_name;
                }

                call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

                return $stmt->execute();
            break;
            case 'REPLACE':
                foreach ($rows as $row) {
                    $count = $count + 1;
                    $final_rows .= '`' . $row . '`' . ($count != $amount ? ', ' : '');
                    $final_data .= '?' . ($count != $amount ? ', ' : '');
                }

                $stmt = $this->db->prepare('REPLACE INTO `' . $this->database . '`.`' . $database . '` (' . $final_rows . ') VALUES (' . $final_data . ')');

                for ($i = 0; $i < count($params); $i++)
                {
                   $bind_name = 'bind'.$i;
                   $$bind_name = $params[$i][1];
                   $bind_names[0] .= $param_types[$params[$i][0]];
                   $bind_names[] = &$$bind_name;
                }

                call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

                return $stmt->execute();
            break;
        }
    }
}

?>

1 个答案:

答案 0 :(得分:0)

要做一些假设,但首先我建议您在制作自己的解决方案之前使用ORM。这是一个很好的PHP库列表(我已经链接到数据库部分,其中包括一些非常完善的独立ORM https://github.com/ziadoz/awesome-php#database

那就是说我将假设$ where和$或数组都是WHERE结构,$ where中的项目通过AND和$组合,或者通过OR组合。

因为您没有描述您要查找的输出类型,我还假设您的$ where和$或键/值对转换为&#34; key = value AND key =值AND(键=值OR键=值)&#34;。

免责声明:这个例子有点hacky,但却是获取示例的最短/最简单的方法。

Highcharts.getOptions().exporting.buttons.contextButton.menuItems.slice(2)

然后您可以在UPDATE或SELECT结束时粘贴$ whereQuery。即使$ where和$或为空,它仍然有效。

如果$ value是另一个数组,你可以将循环移动到函数中并使其递归,这样你就可以创建更复杂的WHERE语句。