Используйте PDO, люди! Ну!

Используйте PDO, люди! Ну!

Нет прав для скачивания
Я как читаю ваши споры про всякие mysql_connect, mysql_pconnect, mysqli_connect и так далее - грустно становится. Почему не PDO? Он существует с самых ранних версий пых. Они почти никогда не меняется. Если бы старые игры писали используя его, сейчас бы у многих не было бы неподъёмных проблем портирования игр на php версии ниже 5.6 на более современные редакции.

Да, в документации, которую никто из вас никогда не открывал, всё выглядит страшненько. Зато не нужно бояться sql-инъекций, например. Да, в чистом виде реализация выглядит немного монструозно, но вот вам небольшой класс, который поможет просто попробовать его в действии.

Пусть это будет Db.class.php.
PHP:
<?php

class Db
{
    public $pdo;

    public function __construct($db, $username = NULL, $password = NULL, $host = '127.0.0.1', $port = 3306, $options = [])
    {
        $default_options = [
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ];
        $options = array_replace($default_options, $options);
        $dsn = "mysql:host=$host;dbname=$db;port=$port;charset=utf8mb4";

        try {
            $this->pdo = new \PDO($dsn, $username, $password, $options);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }
    public function run($sql, $args = NULL)
    {
        if (!$args)
        {
            return $this->pdo->query($sql);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

Это, считай, базовые настройки и один вызов, который заменит mysql_connect и mysql_query. Это не истина и не учебник, это я так придумал для себя и пишу такое людям, даже тем, с которых беру деньги. Есть и другие варианты, их можно дописать под конкретную задачу. Как вызвать?

PHP:
// Подключаем созданный файл
require_once 'Db.class.php';
// Теперь наша база будет в этой переменной. Имя "Db" регистрозависимо!
$db = new Db('db_name', 'db_user', 'db_password');

Как писать запросы?
PHP:
// Вместо (выкусил из поиска по форуму)
mysql_query('DELETE FROM `battle_cache` WHERE `uid` = "'.mysql_real_escape_string($this->ucleari[$i]).'"');
// Это. Квадратные скобки нужны - там массив!
// А вот mysql_real_escape_string уже не очень и нужен.
$db->run('delete from battle_cache where uid = ?', [$this->ucleari[$i]]);

// Вместо (выкусил из поиска по форуму)
$var = mysql_fetch_array(mysql_query('SELECT * FROM `zayvki` WHERE `city` = "'.self::$bot['city'].'" AND `otk` < "'.rand( 2, 6 ).'" AND `time` < "'.( time() - rand( 15, 25 ) ).'" AND `bcs` < "'.time().'" AND `start` = "0" AND `razdel` = "'.$rz.'" AND `cancel` = "0" AND `time` > "'.( time() - 1111).'" AND `money3` = 0 ORDER BY `time` DESC  LIMIT 1'));
// Это.
$var = $db->run('select * from zayvki where city = ? and otk = ? and time = ? and bcs = ? and start = ? and razdel = ? and cancel = 0 and time = ? and money3 = 0 order by time desc limit 1', [self::$bot['city'], rand(2, 6), time() - rand(15, 25), time(), $rz, time() - 1111])->fetch;

В моём примере в качестве замены mysql_fetch_array(mysql_query('запрос')) использовалось $db->run('запрос')->fetch.
Fetch - это одна из служебных команд. На самом деле их куда больше.
Подробнее в документации.

Запросы получаются короче и проще. Больше не надо воевать с неправильно размещёнными кавычками. Сначала идёт чистый запрос без переменных, потом идут сами переменные. Помимо прочего позволяет делать неожиданные решения, вроде выноса всех запросов в файле в начало файла, чтобы можно было открыв сразу понять что происходит, а вызывать их ниже по ходу. Например:

PHP:
// Все запросы
define("Q1","delete from battle_cache where uid = ?");
define("Q2","select * from zayvki where city = ? and otk = ? and time = ? and bcs = ? and start = ? and razdel = ? and cancel = 0 and time = ? and money3 = 0 order by time desc limit 1");
/** Куча промежуточного кода */
$db->run(Q1, [$this->uncleari[$i]]);
/** Куча промежуточного кода */
$db->run(Q2, [self::$bot['city'], rand(2, 6), time() - rand(15, 25), time(), $rz, time() - 1111])->fetch

И главное: это будет работать как в стареньком php5, так и в самом новом php8.
Да, это ж надо сесть и переписать. Но если вы и так переезжаете с mysql на mysqli, то почему бы не переехать сразу на это?
  • Like
Реакции: NorD и CyberVit
Автор
Insallah
Скачивания
1
Просмотры
634
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Insallah

Сверху