Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
1

Не работает запрос на добавление с одинарной кавычкой

21.09.2013, 22:59. Просмотров 2553. Ответов 15
Метки нет (Все метки)


Добрый вечер, такая ситуация, есть в базе MySQL две таблицы, одна из них таблица импорта. Добавляю данные из импорта примерно так:
PHP
1
2
3
4
5
6
$imp_query="SELECT imp_teble.name_kl FROM imp_table";
$imp=mysql_query($imp_dog_query);
while($result_row=mysql_fetch_array($imp)){
$add_query="INSERT INTO imp_table(name_kl) VALUES ('$result_row[name_kl]')";
$add=mysql_query($add_query);
}
Все работает за исключением когда в имени, или фамилии встречается одинарная кавычка. Например когда вносил человека с фамилией: Севост'янов. Получается что запрос выглядит так ....VALUES ('Севост'янов')... Когда я в запрос передавал одну переменную, применял addslashes(). А вот как в такой ситуации быть не пойму.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2013, 22:59
Ответы с готовыми решениями:

Добавление в строку экранирующего символа '\' перед каждой кавычкой в строке
Помогите пожалуйста!) Нужно написать класс StringFormatter с методом string SafeString( string s...

Не работает запрос на добавление
Доброго времени суток. Проблема такая: не работает запрос на добавление. Создать запрос на...

Не работает запрос на добавление
При нажатии на кнопку из формы регистрации авто, данные должны записываться в таблицу страхования....

Запрос на добавление не работает
Добрый день! Имеется Таблица -Tab1 Структура: Tab1.Chet, Tab1.Prihod, Tab1.Rashod В поле...

15
26 / 26 / 9
Регистрация: 02.01.2011
Сообщений: 135
Записей в блоге: 1
21.09.2013, 23:18 2
Попробуйте

PHP
1
2
3
4
5
6
7
$imp_query="SELECT imp_teble.name_kl FROM imp_table";
$imp=mysql_query($imp_dog_query);
while($result_row=mysql_fetch_array($imp)){
$add_query="INSERT INTO imp_table(name_kl) VALUES ('$result_row[name_kl]')";
$add_query= addcslashes($add_query);
$add=mysql_query($add_query);
}
0
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
22.09.2013, 00:32  [ТС] 3
Цитата Сообщение от Hagacure Посмотреть сообщение
Попробуйте

PHP
1
2
3
4
5
6
7
$imp_query="SELECT imp_teble.name_kl FROM imp_table";
$imp=mysql_query($imp_dog_query);
while($result_row=mysql_fetch_array($imp)){
$add_query="INSERT INTO imp_table(name_kl) VALUES ('$result_row[name_kl]')";
$add_query= addcslashes($add_query);
$add=mysql_query($add_query);
}
Неа, не сработало...
Warning: addcslashes() expects exactly 2 parameters, 1 given in Z:\home\localhost\www\alfagroup\people_add.php on line 53

Ошибка добавления строки - 1065: Query was empty
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16826 / 6704 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
22.09.2013, 13:25 4
addslashes тогда уж, а лучше mysql_real_escape_string. И не к запросу, а к переменным.
1
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
22.09.2013, 19:17  [ТС] 5
Цитата Сообщение от KOPOJI Посмотреть сообщение
addslashes тогда уж, а лучше mysql_real_escape_string. И не к запросу, а к переменным.
Но вот и дело в том что у меня не получается применить addslashes именно к каким то переменным запроса. Единственное что у меня получилось добиться результата так за место одинарной кавычки наисать вот так:
$add_query="INSERT INTO imp_table(name_kl) VALUES (\"$result_row[name_kl]\")";
Работает, но не уверен что это правильное решение... с точки зрения грамотного кода.
0
Заблокирован
22.09.2013, 19:28 6
Цитата

PHP
1
2
3
4
5
$imp_query="SELECT imp_teble.name_kl FROM imp_table";
$imp=mysql_query($imp_dog_query);
while($result_row=mysql_fetch_array($imp)){
$add_query="INSERT INTO imp_table(name_kl) VALUES ('$result_row[name_kl]')";
$add=mysql_query($add_query);
Конец цитаты.

Если мануал не врет, это все делается так:

SQL
1
INSERT INTO imp_table (name_kl) SELECT imp_teble.name_kl FROM imp_table;
http://dev.mysql.com/doc/refma... elect.html

Добавлено через 4 минуты
Однако довольно странная задача. Взять name_kl из imp_table и добавить в imp_table значения поля name_kl.

Так и должно быть, или что-то пропустил?
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16826 / 6704 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
22.09.2013, 20:20 7
Цитата Сообщение от vavilom Посмотреть сообщение
Работает, но не уверен что это правильное решение
работает до тех пор, пока не встретится теперь уже двойная кавычка. Можно, например, так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const MAX_VALUES = 30;
 
$imp_query="SELECT imp_teble.name_kl FROM imp_table";
$imp=mysql_query($imp_dog_query);
$add_query = 'INSERT INTO `imp_table`(`name_kl`) VALUES ';
 
$i = $j = 0;
 
while($result_row=mysql_fetch_assoc($imp)){
    $i++ > 0 && $i % MAX_VALUES === 1 && $j++;
    isset($insert[$j]) || ($insert[$j] = NULL);
    $insert[$j] .= '("' . mysql_real_escape_string($result_row['name_kl']) . '"), ';
}
for($i = 0, $cnt = count($insert); $i < $cnt; $i++)
    mysql_query( $add_query . rtrim($insert[$i], ', ') );
1
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
22.09.2013, 20:28  [ТС] 8
Цитата Сообщение от sqlnub Посмотреть сообщение
Цитата
Однако довольно странная задача. Взять name_kl из imp_table и добавить в imp_table значения поля name_kl.

Так и должно быть, или что-то пропустил?
Спасибо за помощь, получилось! И правда очень странная задача)) На самом деле я ошибся, там вставка в другую таблицу идет. Но факт остается фактом, вдруг в будущем подобная проблема будет, хочется знать как правильно писать чтоб небыло таких ошибок.

Добавлено через 6 минут
Цитата Сообщение от KOPOJI Посмотреть сообщение
работает до тех пор, пока не встретится теперь уже двойная кавычка. Можно, например, так
Да об этом я как то и не подумал Спасибо за ваш пример, сегодня уже некогда с ним разбираться, но идею я понял, завтра попробую реализовать!
0
Заблокирован
23.09.2013, 10:00 9
Копирование данных между таблицами делается сугубо запросами, без всяких процедур. В это можно даже верить не зная, потому что СУБД не может не иметь такого рода методов. Иначе это не СУБД, применительно и к такой как mySQL.

Типовой запрос на копирование это INSERT INTO ... SELECT...
0
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
23.09.2013, 11:46  [ТС] 10
Цитата Сообщение от sqlnub Посмотреть сообщение
Копирование данных между таблицами делается сугубо запросами, без всяких процедур. В это можно даже верить не зная, потому что СУБД не может не иметь такого рода методов. Иначе это не СУБД, применительно и к такой как mySQL.

Типовой запрос на копирование это INSERT INTO ... SELECT...
Это я уже понял, спасибо. Но все равно сама проблема подобная думаю может в жизни еще встретиться... Вот и на будущее буду знать как с ней бороться.
0
Заблокирован
24.09.2013, 05:56 11
При копировании запросом вам не надо думать о санации данных, в этом весь сахар.
0
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
24.09.2013, 19:07  [ТС] 12
Цитата Сообщение от sqlnub Посмотреть сообщение
При копировании запросом вам не надо думать о санации данных, в этом весь сахар.
Да спасибо, в этом я разобрался, но сложность теперь возникла в том что средствами php я по мимо выборки добавлял вычисляемые переменные в нужную таблицу например так:
PHP
1
2
3
4
5
6
7
8
9
10
...
while($result_row=mysql_fetch_array($imp_table)){
    if($result_row[sh]==1)$pp=0.065*$result_row[sum];
        else if($result_row[sh]==2)$pp=0.05*$result_row[sum];
            else die("Неправильная схема активе № ".$result_row['tnum']);
$add_query="INSERT INTO table( tnum, pp...) VALUES (inmtnum, $pp...);
//и после удачного добавления была надпись что номер такой то успешно внесен, потом удалялась из таблицы импорта та строка которая добавилась...
$drop_imp="DELETE FROM `imp_table` WHERE `tnum`=$result_row[tnum]";
...
}
А вот средствами mysql как это в запросе так сделать?
0
Заблокирован
24.09.2013, 19:14 13
Копирование данных между таблицами применяется для реализации квази-ручных методов репликации, при перестройке структуры, восстановлении целостности и в таком роде. В рабочем порядке копировать не имеет смысла, потому что весь смысл в отношениях.
0
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
24.09.2013, 20:09  [ТС] 14
Цитата Сообщение от sqlnub Посмотреть сообщение
Копирование данных между таблицами применяется для реализации квази-ручных методов репликации, при перестройке структуры, восстановлении целостности и в таком роде. В рабочем порядке копировать не имеет смысла, потому что весь смысл в отношениях.
Вообще это сложно объяснить, но сейчас попробую, может быть кто то посоветует удобней методы работы.
Ситуация в том что база MySQL на данный момент не работает, а всего лишь я пытаюсь перейти с MS SQL на MySQL.
А таблица импорта делается для того что сотрудники вносят данные в нее, потом эти данные в конце дня проверяются в головном офисе, чтоб в основную таблицу не попало не чего лишнего или неправильного, и после проверки сотрудником подтверждается копирование в основную таблицу. Это первая причина.
Вторая: с точки зрения безопасности, что только сотрудники головного офиса имеют право на добавление в основную таблицу.
Третья над которой я сейчас думаю... Это вставка из Exel. Не все сотрудники имеют доступ к базе, командировки например. Они по почте отправляют отчет в Exel. Для работы с MS SQL доступ организован через access, и там просто открываем связанную таблицу импорта, из Exel Ctrl+C в таблицу импорта Ctrl+V, и потом нажатием одной кнопки эти отчеты вносятся в основную таблицу. Удобно и быстро. Но говорю же это не идеал, это то что я смог придумать. Понимаю сейчас что через PHP наверно не получится вставлять Ctrl+C/Ctrl+V. Надо будет искать другой метод работы с отчетами Exel.

А вообще ситуация решилась с ошибкой, покопался с кодом KOPOJI, и ко всем полям куда пользователи могут вставить кавычки, пришлось прописать mysql_real_escape_string.

P.S. Конечено если кто то считает что мы работаем не правильно, буду благодарен за любой совет в сторону улучшения организации рабочего процесса.
0
Заблокирован
24.09.2013, 21:31 15
Цитата Сообщение от vavilom Посмотреть сообщение
А таблица импорта делается для того что сотрудники вносят данные в нее, потом эти данные в конце дня проверяются в головном офисе, чтоб в основную таблицу не попало не чего лишнего или неправильного, и после проверки сотрудником подтверждается копирование в основную таблицу. Это первая причина.
Понятно. Догадаться добавить поле на два состояния до и после цензуры вы не захотели. Вы видели форумы с премодерацией? Ну, когда написал, а появится после цензуры или вообще не появится. Вы подумали "они там копируют". Ничего не копируется и может даже не удаляться. Просто есть поле значение которого показывает можно это показывать всем, или нельзя всем, а только тем, кому можно. Эту систему можно расширить. Добавить значений, добавить ролей, разрешений и все такое. Допустим культурному начальству можно постить без цензуры, а для тупых рабов она обязательна, иначе накосячат.

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

Вторая: с точки зрения безопасности, что только сотрудники головного офиса имеют право на добавление в основную таблицу.
То же самое. Планктон вносит, а начальство косит. Чтобы косяки не сверкали пока начальство доберется - то самое поле попросту не дает данным быть отображенными и учтенными где-бы-то-ни-было.

Из екзеля делают csv и тупо закачивают его для импорта.

Добавлено через 7 минут
И конечно сам принцип. Я знаю что принято нанимать полных идиотов не способных даже на бит самостоятельной мысли, рабов, короче, интеллектуальных. Но посмотрите что получается. А получается в точности такая же картина отношений, как и в случае рабов материальных. Когда рабовладелец оказывается порабощен своими рабами. Ради кого вся эта хитрая репликация и фильтрация разрабатывается и оплачивается? Правильно - ради них. Понятно? Были бы они чуть умнее - и не пришлось бы тратить время и деньги, наоборот, пришлось бы их зарабатывать. Впрочем сейчас вы на них зарабатываете.

Добавлено через 6 минут
Культура работы с БД требует определенного интеллектуального развития. Как и демократия, кстати. Теперь понятно почему у нас рулит екзель и социализм?
1
4 / 4 / 2
Регистрация: 19.10.2011
Сообщений: 187
24.09.2013, 21:47  [ТС] 16
Спасибо конечно за советы, некоторые моменты учту... Я думаю что все равно сколько людей столько и мнений, и не вижу плохой идеей не допускать к важной таблице всех подряд. Но все таки как вариант поля модерации учту... Но вот по поводу этой фразы:
Цитата Сообщение от sqlnub Посмотреть сообщение
Культура работы с БД требует определенного интеллектуального развития. Как и демократия, кстати. Теперь понятно почему у нас рулит екзель и социализм?
Хочется спросить:
Вы сразу родились с IQ выше чем у Наполеона? Форумы пестрят такими умными фразами. Культура работы с БД требует еще и опыта не так ли? А люди просят помощи на форумах для того чтоб, те у кого опыта много, с ними поделились. А не показывали на сколько другим не хватает интеллектуального развития!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2013, 21:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Не работает запрос на добавление
Всем доброго времени суток! Выбираю данные из 2-х таблиц и помещаю их в третью таким запросом: ...

не работает запрос на добавление INSERT INTO...
не получается сделать запрос: INSERT INTO продажа ( , , ) VALUES ((SELECT техника. FROM техника...

Не работает запрос на добавление из коллекции в бд
Запрос declare b_id number; l_count number; begin l_count :=...

Почему запрос на добавление работает не одинаково в двух указанных случаях
Сразу прошу извинить, так как знания мои не так обширны, как хотелось бы. На мой неопытный взгляд,...

Слово с кавычкой
Суть проста, есть фраза &quot;I'll deliver your liqour&quot;, пишу скрипт для бота и программе надо нажать...

Многострочный массив с кавычкой
Дан массив вида: Как поставить эту кавычку? '/' - не помогает! string mas = @&quot;1 2 &quot;3 4 5&quot;;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.