mysqli\u在类中使用prepared语句的查询

js5cn81o  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(326)

我正在使用一个旧程序,它使用 mysql_* functions (已弃用)在用于数据库连接和执行查询的类中。很多页面都在使用这个类,所以我想我需要对它做一些小的修改。所以我在本地机器上下载了这个程序,并尝试升级到 mysqli_* 功能。
这是一节课:

final class db{
static $db;

static function config($conf=false){
    self::$db = mysqli_connect($conf['host'], $conf['username'], $conf['password']);
    if (!self::$db) {
        die("Database connection failed: " . mysqli_connect_error());
    }

    mysqli_select_db(self::$db, $conf['database']);

}

static function query($sql){
    $result = mysqli_query(self::$db, $sql);
    if(!$result) trigger_error("MySQL UPDATE error: ".mysqli_error(self::$db).'<pre>'.$sql.'</pre><br>');
}

static function select($sql, $args=false){

    if($args['pager']){
        $limit = self::load_pager($args['pager']);
        $sql .= 'LIMIT '.$limit;
    }

    $result = mysqli_query(self::$db, $sql);
    if(!$result) trigger_error("MySQL SELECT error: ".mysqli_error()." using ".$sql);

    if(@$args['explain']==true) self::explain($sql);

    while ($r = mysqli_fetch_array($result,MYSQLI_ASSOC)){
            $row[] = $r;
    }

    mysqli_free_result($result);

    @array_walk_recursive($row, 'de_clean_post_recursive');
    return @$row;
}

 }

我已经把它们改成了 mysqli .
在此之前,我使用此代码将记录插入、更新或删除到数据库中。插入示例:

$sql = "INSERT INTO transactions_in(
                    transact_in_date,
                    transact_in_total_sacks,
                    transact_in_from_location,
                    transact_in_to_location,
                    transact_in_note,
                    transact_in_by_user,
                    transact_in_date_added
                    )
                    VALUES(
                    '{$transact_date}',
                    '{$post['transact_total_sacks']}',
                    '{$post['transact_from_location']}',
                    '{$my_location}',
                    '{$post['transact_note']}',
                    '{$_SESSION['user_name']}',
                     NOW()
                    )";
    db::query($sql);
}

现在,我试着用一个准备好的语句来使用msqli函数。例子:

$sql = "INSERT INTO transactions_in(
                    transact_in_date,
                    transact_in_total_sacks,
                    transact_in_from_location,
                    transact_in_to_location,
                    transact_in_note,
                    transact_in_by_user,
                    transact_in_date_added
                    )
                    VALUES (?,?,?,?,?,?,NOW())";
    #echo $sql;
    #exit;
    db::query($sql,[ $transact_date, $post['transact_total_sacks'], $post['transact_from_location'], $my_location, $post['transact_note'], $_SESSION['user_name'] ]);

问题:使用prepared语句运行insert查询时出错。
注意:mysql更新错误:您的sql语法有错误;检查与您的mariadb服务器版本对应的手册,以了解在第10行的“?,?,?,?,?,?,now())”附近使用的正确语法
有人告诉我的 mysqli_query 不运行准备好的语句。如果这是真的,对我来说什么是正确的方法?

sqougxex

sqougxex1#

你的 query 方法只能获取一个参数。向其传递两个参数:

db::query($sql,[$transact_date, $post['transact_total_sacks'], $post['transact_from_location'], $my_location, $post['transact_note'], $_SESSION['user_name']]);

通过使用 pdo 你需要更多的灵活性。

class db {
    static $pdo;
    public function __construct()
    {
        self::$pdo = new PDO('CONNECTION STRING');
    }

    public static function query($query, $params){
        $stmt = self::$pdo->prepare($query);
        $stmt->execute($prarams);
    }
}

然后你可以这样使用它:

$sql = "INSERT INTO transactions_in(
                    transact_in_date,
                    transact_in_total_sacks,
                    transact_in_from_location,
                    transact_in_to_location,
                    transact_in_note,
                    transact_in_by_user,
                    transact_in_date_added
                    )
                    VALUES (?,?,?,?,?,?,NOW())";
    #echo $sql;
    #exit;

db::query($sql, [
            $transact_date,
            $post['transact_total_sacks'],
            $post['transact_from_location'],
            $my_location,
            $post['transact_note'],
            $_SESSION['user_name']
        ]);

相关问题