Я как читаю ваши споры про всякие
Да, в документации, которую никто из вас никогда не открывал, всё выглядит страшненько. Зато не нужно бояться sql-инъекций, например. Да, в чистом виде реализация выглядит немного монструозно, но вот вам небольшой класс, который поможет просто попробовать его в действии.
Пусть это будет Db.class.php.
Это, считай, базовые настройки и один вызов, который заменит
Как писать запросы?
Запросы получаются короче и проще. Больше не надо воевать с неправильно размещёнными кавычками. Сначала идёт чистый запрос без переменных, потом идут сами переменные. Помимо прочего позволяет делать неожиданные решения, вроде выноса всех запросов в файле в начало файла, чтобы можно было открыв сразу понять что происходит, а вызывать их ниже по ходу. Например:
И главное: это будет работать как в стареньком php5, так и в самом новом php8.
Да, это ж надо сесть и переписать. Но если вы и так переезжаете с mysql на mysqli, то почему бы не переехать сразу на это?
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;
В моём примере в качестве замены
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, то почему бы не переехать сразу на это?