mysqli_query с подготовленным оператором в классе - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю со старой программой, которая использует mysql_* functions (устарело) в классе для соединения с базой данных и выполнения запросов. Многие страницы используют этот класс, поэтому я думаю, что мне нужно внести в него небольшие изменения. Поэтому я загрузил программу на свой локальный компьютер и попытался обновить ее до mysqli_* функций.

Это класс:

<code>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.'

'); } статическая функция select ($ sql, $ args = false) { если ($ арг [ 'пейджера']) { $ limit = self :: load_pager ($ args ['pager']); $ sql. = 'LIMIT'. $ limit; } $ result = mysqli_query (self :: $ db, $ sql); if (! $ result) trigger_error ("Ошибка MySQL SELECT:" .mysqli_error (). "using". $ sql); if (@ $ args ['объяснение'] == правда) self :: объяснение ($ sql); while ($ r = mysqli_fetch_array ($ result, MYSQLI_ASSOC)) { $ row [] = $ r; } mysqli_free_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'] ]);

Вопросы: Выполнение запроса вставки с подготовленным оператором выдает ошибку.

Примечание. Ошибка обновления MySQL: в синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '?,?,?,?,?,?, NOW ())' в строке 10

Кто-то сказал мне, что mysqli_query не запускает подготовленные операторы. Если это правда, как правильно сделать это в моем случае?

1 Ответ

0 голосов
/ 07 сентября 2018

Ваш 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']
        ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...