Вроде топик создавал в теме "Веб строительство", как он тут оказался непонятно.
Проблему решил передав не массивом а строкой параметры.
Как правило у меня сложные запросы бывает несколько десятков переменных и в итоге получится 100500 строк. К сожалению не вижу упрощения лично для себя.
Мой говнокод выше к сожалению тоже нормально работает только с одной переменной.... ПОка не нашел нормальных вариантов.
Наговнокодил через регулярку, вроде работает как я хотел
if (preg_match('~(^UPDATE|^INSERT)~m', $str, $str_arr)){ $str = preg_replace_callback("~(,('|\s+'))((.*))'(\s+,|,\)|\s+\)|,)~mU ", function($matches) { return ", '" . addslashes($matches[3]) . "',"; },$str); var_dump($str); return $this->conn->exec($str); }
Я бы глянул как это в Doctrine DBAL сделано (именно DBAL, a не ORM)
https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#delete - интерфейс простейший, как по мне
Один фиг на выходе я получаю писанину много большего кол-ва строк и неудобств чем было ДО.
В процедурном стиле я тратил 5 строк кода на подключения к базе
$database = ''; $user = ''; $password = ''; $conn = new PDO("mysql:host=localhost;dbname=" . $database . ";charset=UTF8", $user, $password);$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
и далее только строки выполнения запроса по типу
$sql = "INSERT INTO `proxy` (`id`, `name`, `time`, `capcha`, `error`, `count`) VALUES (NULL, '{$line}', '{$time}', '0', '0', '0');"; $conn->query($sql);
Оставалось только думать какие переменные нужно экранировать.
Я же хотел потратить время, написать класс работы с базой данных, чтобы он помог мне перестать думать об экранировании и безопасности, но что еще важно - не усложняя написания самих запросов.
Оказалось так нельзя и вероятно опять придется отложить ООП на полочку ))
Вам же Marat_Kh показал образец подготовленного запроса. PDO уже позаботилось чтобы не было SQL инъекций, надо делать подготовленный запрос.
То есть сначала формируется запрос с переменными вида :name далее PDO проверяет запрос и если всё хорошо подставляете вместо переменных данные.
печалька.. 😂
Про подготовленные запросы я прочитал, но в итоге получится в 2 раза больше строк чем я обычно пишу.
Хотелось бы наоборот упростить себе задачу, а не усложнить, при этом козыряя - вот дескать на ООП пишу )))
Я бы хотел писать такие запросы типы
$str = "П'етр первый";$insert = $db->request("INSERT INTO `test` (`id`, `name`, `url`, `sid`) VALUES (NULL, '{$str}', 'http://google.com', '0');");
и не думать каждый раз, а что там в переменной, надо ли экранировать - чтобы класс сам все экранировал, без танцев с подготовленными запросами.
Нельзя так?
Спасибо за ответы - но все что предложили выше вроде бы не универсально. Insert ведь разные бывают в разные таблицы, разное кол-во полей, условия там разные....
По сути мне нужно просто экранирование кавычек но ДЛЯ ЛЮБОГО запроса пришедшего в класс. Так можно сделать?
Удалил Хром из системы, удалил Хромдрайвер. Установил все заново.
Проверил версию -
Google Chrome 86.0.4240.75
Скачал вебдрайвер версии (теперь при запуске пишет правильную версию, раньше реально старая стояла)
ChromeDriver 86.0.4240.22
Повторил запуск - те же ошибки (((
Вам уже ответили что INNER JOIN тут бессмысленно применять, таблица то одна и та же.