1

Пробую изменить значение глобальной переменной MySQL отвечающей за логирование SQL запросов проходящих через сервер примерно следующим кодом:

$stmt = $pdo->prepare("SET global `general_log` = :value;");
$result = $stmt->execute(array("value"=>$changeLoggerStateValue));
var_dump($result);

В результате получаю false в var_dump. Что то не понял почему запрос не отрабатывает. Переменная $changeLoggerStateValue строго int и содержит либо 0 либо 1.

Запрос на чтение значение переменной из тоже же глобальной переменной нормально отрабатывает, он имеет следующий вид:

$stmt = $pdo->query("SELECT @@general_log;");

Как выполнить данный запрос к MySQL чтобы он корректно отработал? И очень желательно именно через PDO.

  • а ползователь-то у тебя какой пытается глобальную настройку поменять? – Ипатьев Apr 12 '21 at 08:29
  • 1
    Пользователь не root, при этом тот же пользователь может выполнить в phpMyAdmin запрос вида SET global general_log = 1; и он нормально отрабатывает, на права не ругается. Проверял значение переменной после его выполнения - сохраняется. Может в PDO для целей изменения глобальных переменных MySQL предусмотрен какой-то специальный синтаксис? – skvernoslov Apr 12 '21 at 08:33
  • У ПДО нет никакого своего синтаксиса. Это посыльный, который берет твой запрос и несет в базу данных. Вообщем, правильная настройка ПДО спасёт отца русской демократии – Ипатьев Apr 12 '21 at 08:39
  • Во-первых, надо настраивать ПДО чтобы он сам тебе сообщал об ошибках. А во-вторых, отключение режима эмуляции должно решить проблему – Ипатьев Apr 12 '21 at 08:41
  • 1
    PDOException ничего не возвращает в данном блоке кода. Можно чуть подробнее про "отключение режима эмуляции"? – skvernoslov Apr 12 '21 at 08:43
  • Всё по ссылке вверху. Ну правда про эмуляцию там нету. Поменял ссылку на другую. – Ипатьев Apr 12 '21 at 08:48
  • 2
    Прочитал информацию по ссылке которую Вы привели, после добавления строк кода $options = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_EMULATE_PREPARES => false); $pdo = new PDO("mysql:host=localhost;dbname=mysql",$user,$password,$options); появилась ошибка SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'general_log' can't be set to the value of '1' а с этим мне что делать? Я кстати не считаю что вопрос является дубликатом, так как он более конкретный и про глобальные переменные. – skvernoslov Apr 12 '21 at 09:01
  • Мда, действительно, эмуляция не помогает. Тогда надо воспользоваться вторым ответом, и привязывать переменную отдельно. – Ипатьев Apr 12 '21 at 09:13
  • Получилось в итоге с bindparam? – Ипатьев Apr 12 '21 at 09:51
  • 1
    Нет, ошибка которую я выше описал. Чтобы не тратить рабочее время на этот вопрос по условию когда необходимо изменить значение глобальной переменной mysql добавил php код который делает это через mysqli, вот этот код: $conn = new mysqli("localhost",$user,$password);if (!$conn->connect_error) {$conn->query("SET global general_log = $changeLoggerStateValue;");} пока на этом остановился. При наличии свободного времени может быть вернусь к вопросу. – skvernoslov Apr 12 '21 at 11:01
  • Не понял, а при чем здесь mysqli? На PDO написать $conn->query("SET global general_log = $changeLoggerStateValue;"); нельзя было? :) – Ипатьев Apr 12 '21 at 12:03
  • И что значит "не получилось"? можно посмотреть код, который "не получился"? – Ипатьев Apr 12 '21 at 12:03

0 Answers0