Dram

Рейтинг
1115
Регистрация
28.06.2008

Вроде топик создавал в теме "Веб строительство", как он тут оказался непонятно.

Проблему решил передав не массивом а строкой параметры.

kuzma-95 #:
По-моему не сложно написать три строчки. И так легче читается.

Как правило у меня сложные запросы бывает несколько десятков переменных и в итоге получится 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);

Оставалось только думать какие переменные нужно экранировать.

Я же хотел потратить время, написать класс работы с базой данных, чтобы он помог мне перестать думать об экранировании и безопасности, но что еще важно - не усложняя написания самих запросов.

Оказалось так нельзя и вероятно опять придется отложить ООП на полочку ))

ArbNet #:

Вам же 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

Повторил запуск - те же ошибки (((

Проблему вроде детектировал - страницы поиске на случайной итерации просто не загружались, вероятно сайт не справляется с такой скоростью. Поставлю слип в 1 сек.
Вопрос решен - нужно было    try{} catch{} внутрь цикла засунуть...
alexverem #:
да во втором  nomenclature лишняя, значит без нее правильно. И будет тоже самое что первый вариант значит?

Вам уже ответили что INNER JOIN тут бессмысленно применять, таблица то одна и та же.

Всего: 6928