mysqli_query在类中具有准备好的语句

时间:2018-09-07 03:04:40

标签: php mysql mysqli

我正在使用一个旧程序,该程序在类中使用calss A { int propToKeep; } class B extends A { @Override int propToKeep; int propToDrop; } (不建议使用)进行数据库连接和执行查询。许多页面正在使用此类,因此我认为我需要对其进行一些小的更改。因此,我将程序下载到了本地计算机上,并尝试将其升级为List<A>个功能。

这是课程:

B

我已经将它们更改为mysql_* functions

在此之前,我正在使用此代码将记录插入或更新或删除到数据库。插入示例:

mysqli_*

现在,我尝试将msqli函数与已准备好的语句一起使用。示例:

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;
}

 }

问题: 使用prepared语句运行insert查询会给我一个错误。

  

注意:MySQL UPDATE错误:您的SQL语法有错误。检查与您的MariaDB服务器版本相对应的手册,以找到在第10行的'?,?,?,?,?,?,?,NOW())'附近使用的正确语法

有人告诉我mysqli没有运行准备好的语句。如果是这样,那么对我来说,正确的做法是什么?

1 个答案:

答案 0 :(得分:2)

您的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']
        ]);