mysqli имеет метод с именем bind_param()
. Он работает совсем по-другому, поэтому заменить код на него не так просто. Первый параметр, переданный bind_param()
, представляет собой строку, состоящую из букв, обозначающих тип параметров. По большей части вы можете использовать s
для всех типов. В вашем случае вам, вероятно, потребуется отобразить логические значения на целые числа. MySQL не имеет истинного логического типа данных, поэтому все логические значения сохраняются как 0 или 1.
Пример может выглядеть следующим образом:
$int = 2;
$bool = (int) false;
$string = '0';
$stmt = $mysqli->prepare('INSERT INTO dates VALUES(?,?,?)');
$stmt->bind_param('sss', $int, $bool, $string);
$stmt->execute();
Все параметры должны быть связаны в одиночный вызов bind_param
и переменные должны передаваться по ссылке, чтобы они не могли быть литералами.
Вы не можете просто заменить свой метод на mysqli-эквивалент. Вам нужно было бы переписать ваш код logi c. Я настоятельно рекомендую придерживаться PDO; это проще и лучше, чем MySQL. Если вы должны использовать mysqli, то вы должны написать или использовать существующий класс абстракции базы данных. Использование mysqli само по себе не рекомендуется.
Это пример того, как может выглядеть такой класс:
class DBClass extends mysqli {
public function __construct(
$host = null,
$username = null,
$passwd = null,
$dbname = null,
$port = null,
$socket = null
) {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
$this->set_charset('utf8mb4');
}
public function safeQuery(string $sql, array $params = []): ?array {
$stmt = $this->prepare($sql);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
if ($result = $stmt->get_result()) {
return $result->fetch_all(MYSQLI_BOTH);
}
return null;
}
}
$int = 2020;
$bool = false;
$string = '0';
$conn = new DBClass('localhost', 'inet', '5432', 'test');
$conn->safeQuery('INSERT INTO dates VALUES(?,?,?)', [$int, (int) $bool, $string]);
var_dump($conn->safeQuery('SELECT * FROM dates WHERE year=2020'));
Это не самый лучший класс за всю историю, но я использую его, чтобы проиллюстрировать, как можно go о расширение mysqli с помощью более простого вспомогательного метода. Он имеет тот же конструктор, что и класс mysqli
, но конструктор включает отчеты об ошибках и устанавливает правильную кодировку. Новый метод является просто оберткой вокруг громоздкого шаблона prepare / bind / execute. Это должно работать для всех видов запросов.