Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
gremlin32
1 / 1 / 0
Регистрация: 15.12.2015
Сообщений: 38
1

Экранирование SQL запроса

18.11.2016, 13:38. Просмотров 3919. Ответов 12
Метки нет (Все метки)

Извините, за возможно, дурацкий и очевидный вопрос но гугл меня не удовлетворил результатом, поэтому спрошу здесь:
У меня есть множество SQL запросов написанных для SQL Navigator. Естественно ни о каком экранировании в данных запросах речи и быть не может. С PHP познакомился относительно недавно. И в чем собственно проблема:
1) В запросах множество кавычек и других символов, которые нужно экранировать, например:
SQL
1
,SUM(DECODE(N.C_1,'^Q1',N.Q,0))  "СТР.1"
Есть ли в php какая-то общая функция для экранирования всего в строке(не в mysql запросе, а именно в строке потому что я работаю с oci)?
2) Название таблиц - в базе все строчными буквами, а я, по незнанию, использовал прописные названия в своих запросах и естественно что навигатор, не задавая лишних вопросов, выполнял такие запросы, а php ругается на то, что он не может найти такой таблицы. Можно ли как-то обойти эту проблему?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2016, 13:38
Ответы с готовыми решениями:

Ошибка SQL-запроса: You have an error in your SQL syntax near 'group(name_group,time)VALUES('123','00:00')'
Уже всю голову сломал, не могу понять в чем косяк? Текст ошибки:You have an error in your SQL...

Экранирование sql запроса
Всем привет. Возникла проблема с экранированием sql запроса внутри mysql_query Сам по себе запрос...

наверно экранирование запроса...
Всем привет!!! Выполняется такая задача: Программа обрабатывает входные данные и запросом...

SQL автоматическое экранирование
Всем думаю известно что текстовые параметры в SQL запросах требуют экранирования кавычек и...

12
Пифагор
Модератор
1631 / 1298 / 639
Регистрация: 10.01.2015
Сообщений: 4,283
18.11.2016, 14:28 2
Цитата Сообщение от gremlin32 Посмотреть сообщение
Есть ли в php какая-то общая функция для экранирования всего в строке(не в mysql запросе, а именно в строке потому что я работаю с oci)?
Например, addslashes() - экранирует спецсимволы в строке.

Пункт 2 не очень понятен. Что именно требуется? Желательно, с примером.
1
gbsoftware
120 / 116 / 77
Регистрация: 19.08.2013
Сообщений: 429
18.11.2016, 15:18 3
Цитата Сообщение от Пифагор Посмотреть сообщение
Пункт 2 не очень понятен. Что именно требуется? Желательно, с примером.
Имхо он имеет ввиду то что PHP чувствителен к регистру в названиях полей базы
1
gremlin32
1 / 1 / 0
Регистрация: 15.12.2015
Сообщений: 38
18.11.2016, 16:10  [ТС] 4
Требуется, чтобы php не был чувствителен к регистру в названиях полей базы (возможно ли это).
0
gbsoftware
120 / 116 / 77
Регистрация: 19.08.2013
Сообщений: 429
18.11.2016, 16:16 5
Цитата Сообщение от gremlin32 Посмотреть сообщение
Требуется, чтобы php не был чувствителен к регистру в названиях полей базы (возможно ли это).
Нет ничего невозможного, перепишите под себя PHP

Не по теме:


Вот кстати можете скооперироваться Как глобально научить php, что ar->a это тоже самое что ar["a"]:D:D:D

1
gremlin32
1 / 1 / 0
Регистрация: 15.12.2015
Сообщений: 38
18.11.2016, 17:08  [ТС] 6
Я просто интерпретировал ваше предположения относительно моего вопроса =). 7-я версия, неужели никто не сталкивался с такой проблемой. Нет, я понимаю что можно одним кликом сделать весь текст прописным и возможно это будет проще, но в связи с тем что я новичок, думаю такие вопросы мне простительны.

Добавлено через 34 минуты
К сожалению, мне не совсем понятно, как с помощью функции addslashes() можно экранировать строчку типа
SQL
1
,SUM(DECODE(N.C_1,'^Q1',N.Q,0))  "СТР.1"
исполнение кода наподобие:
PHP
1
2
3
4
5
6
<?php
.....
$sql1=",SUM(DECODE(N.C_1,'^Q1',N.Q,0))  "СТР.1""
$sql=addslashes($sql1)
.....
?>
0
Jodah
Эксперт PHP
3488 / 2932 / 1235
Регистрация: 01.08.2012
Сообщений: 10,107
18.11.2016, 18:19 7
Цитата Сообщение от gremlin32 Посмотреть сообщение
PHP
1
2
$sql1=",SUM(DECODE(N.C_1,'^Q1',N.Q,0)) "СТР.1""
$sql=addslashes($sql1)
С синтаксисом беда.
PHP
1
$sql1=',SUM(DECODE(N.C_1,"^Q1",N.Q,0)) "СТР.1"';
Либо так:

PHP
1
$sql1=",SUM(DECODE(N.C_1,'^Q1',N.Q,0)) \"СТР.1\"";
Добавлено через 3 минуты
Цитата Сообщение от gremlin32 Посмотреть сообщение
2) Название таблиц - в базе все строчными буквами, а я, по незнанию, использовал прописные названия в своих запросах и естественно что навигатор, не задавая лишних вопросов, выполнял такие запросы, а php ругается на то, что он не может найти такой таблицы. Можно ли как-то обойти эту проблему?
Использовать корректные названия в базе и запросах. Не понял проблему.
1
Kerry_Jr
Эксперт PHP
2274 / 2060 / 953
Регистрация: 14.05.2014
Сообщений: 6,050
Записей в блоге: 1
Завершенные тесты: 5
18.11.2016, 19:13 8
Цитата Сообщение от gremlin32 Посмотреть сообщение
а php ругается на то, что он не может найти такой таблицы
Ругается не PHP, а сервер базы данных. PHP к базам данных прямого отношения не имеет, поэтому ему плевать в каком регистре названия таблиц и пр.
1
gremlin32
1 / 1 / 0
Регистрация: 15.12.2015
Сообщений: 38
19.11.2016, 13:44  [ТС] 9
С синтаксисом беда.
Не хотелось бы бежать впереди паровоза и обвинять Вас в незнании синтаксиса Oracle / PLSQL(так как я его сам плохо знаю).
Но к сожалению указанное Вами выражение:
PHP
1
$sql1=',SUM(DECODE(N.C_1,"^Q1",N.Q,0)) "СТР.1"';
у меня без ошибки не выполняется, ни php-скриптом, ни SQL-навигатором (такое впервые вижу - чтобы в DECODE использовались двойные кавычки).

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Ругается не PHP, а сервер базы данных. PHP к базам данных прямого отношения не имеет, поэтому ему плевать в каком регистре названия таблиц и пр.
Ну я как бы догадывался, что истина где-то рядом =). Спасибо за замечание, но это не решило проблему с обработкой регистра символов.

Добавлено через 32 минуты
Не хотелось разводить здесь флуд, но в связи с тем что у меня плохо получается донести до людей суть проблемы, постараюсь более подробно описать:
Итак: жил-был быдло-кодер-самоучка, который написал около полутора сотни sql запросов(по 150-200 строчек в каждом) для sql-навигатора, о синтаксисческом этикете, а тем более о php знал он по наслышке, но это его мало волновало. Но в один момент начальство быдло-кодера, поставило перед ним задачу: перенести все эти запросы на веб-страницу.
Быдло-кодер поднял LAMP прикрутил к нему Oracle клиент. Запустил свой первый запрос из под php (вроде "Hello world!"), который обращался к базе. И радости нашего эникея не было предела. Но, когда он попробовал перенести, один из ранее написанных, запросов из SQL-навигатора в php-скрипт, его ожидало само разочарование - php-скрипт напрочь отказывался работать без ошибок. Так как sql-запросы были написаны в малом регистре, а строки запросов заполнены кавычками, которые, оказывается, нужно было экранировать.
И в связи с этим я повторюсь, но уже задам вопрос в несколько иной форме:
Что бы Вы, как люди, которые не по наслышке знают о веб-разработке посоветовали нашему эникею, кроме как ответов типа "учи быдло синтаксис" и "не вижу проблем, нужно просто переписать все запросы заново"? (Извините за выражения, но в частичных случаях при недопонимании, одним грубым словом проще заменить целое предложение).

Добавлено через 11 минут
Возможно, стоит забыть notepad++ и начать пользоваться какой-то IDE, которая решает такие задачи за минуту?

Добавлено через 30 минут
Ну допустим я изменил в запросе регистр, банальной заменой экранировал все кавычки, но остается еще одна проблема: как подружить php и кирилические названия столбцов? (их тоже обязательно заменять на латиницу или все-таки можно как-то обойти эту проблему)?
PHP
1
2
3
,(Q.N_REESTR) "РЕЕСТР"
.....
echo '<td>',oci_result($stid, 'РЕЕСТР'), '</td>';
0
Kerry_Jr
Эксперт PHP
2274 / 2060 / 953
Регистрация: 14.05.2014
Сообщений: 6,050
Записей в блоге: 1
Завершенные тесты: 5
19.11.2016, 14:43 10
Цитата Сообщение от gremlin32 Посмотреть сообщение
как подружить php и кирилические названия столбцов?
Собственно, я не зря писал про PHP и сервер БД. PHP ни с кем дружить не надо, он к этому не имеет отношения. Дело может быть в кодировке: например, база данных в UTF-8, а скрипт написан в CP1251 или наоборот. Сначала узнайте, что и в какой кодировке у вас, потом напишите сюда, попробуем разобраться.
1
Jodah
Эксперт PHP
3488 / 2932 / 1235
Регистрация: 01.08.2012
Сообщений: 10,107
19.11.2016, 19:59 11
Цитата Сообщение от gremlin32 Посмотреть сообщение
Не хотелось бы бежать впереди паровоза и обвинять Вас в незнании синтаксиса Oracle / PLSQL(так как я его сам плохо знаю).
Но к сожалению указанное Вами выражение:
Я говорил про PHP синтаксис. В незнании Oracle можете смело обвинять, это будет правдой.
1
gremlin32
1 / 1 / 0
Регистрация: 15.12.2015
Сообщений: 38
22.11.2016, 11:24  [ТС] 12
по запросу SELECT *FROM nls_database_parameters получил стоки вида:
NLS_CHARACTERSET CL8MSWIN1251
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.5.0
Из которых как я понял БД имеет кодировку WIN1251
Открыл php скрипт заменил utf-8 на windows-1251
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$filename=date("Y-m-d H:i:s");
header("Content-Type:   application/vnd.ms-excel; charset=windows-1251");
header("Content-type:   application/x-msexcel; charset=windows-1251");
header("Content-Disposition: attachment; filename=$filename.xsl");  
$db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.2)(PORT = 1521)))(CONNECT_DATA=(SID=q)(SERVER=DEDICATED)))";
$conn = oci_connect('login', 'password', $db);
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sql = ('SELECT (z.data) "Дата",SUM(DECODE(n.c,\'^R1A\',n.sm,0)) "СТР.1" from local.dates z, local.sums n');
$stid = oci_parse($conn, $sql);
oci_execute($stid);
?>
<head>
<meta http-equiv="content-type" content="text/html;charset=windows-1251" />
<title>СЕЛЕКТ</title>
<style>body { font-family: times;}</style>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" bgcolor=#7FFF00><CENTER>СТРОКИ</CENTER></td>
</tr>
<tr bgcolor=#00FFFF>
<td>ДАТА</td>
<td>СТРОКА</td>
</tr>
<?php
while (oci_fetch($stid)) {
echo '<tr>';
echo '<td>',oci_result($stid, 'Дата'), '</td>';
echo '<td>',oci_result($stid, 'СТР.1'), '</td>';
echo '</tr>';
}
echo '</table>';
oci_free_statement($stid);
oci_close($conn);
?>
Сменил кодировку самого скрипта на windows-1251
Но все равно на выходе получаю в столбце ошибку типа:
Warning: oci_result(): Invalid column name "Дата" in ...
Также если называю столбцы латиницей: то строки выбирает, но на подобии кракозябров - "???????? ?.?.", если внутри кирилица.

Добавлено через 15 часов 12 минут
В принципе изначальный вопрос можно считать закрытым, так как сейчас на передний план выходит проблема с кодировкой:
1) SQL-запрос ругается на то, что он не может найти столбцы, которым присвоено кириллическое название.
2) В строках некорректно отображается кириллица в виде: "???????? ?.?.".

Добавлено через 5 минут
PS: чем Вы изменяете кодировку самого скрипта, как по мне в notepad++ это не совсем удобно реализовано.

Добавлено через 27 минут
PS: наверное мне лучше подучить матчасть, а потом возвращаться к данному запросу...
0
Jodah
Эксперт PHP
3488 / 2932 / 1235
Регистрация: 01.08.2012
Сообщений: 10,107
22.11.2016, 14:10 13
Цитата Сообщение от gremlin32 Посмотреть сообщение
проблема с кодировкой
Можете тут посмотреть.
1
22.11.2016, 14:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2016, 14:10

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

Ошибка SQL запроса: SQL logic error or missing database
Здравствуйте, помогите решить проблему. Считываю бинарный файл и отправляю в БД(использую SQLite) с...

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

SQL запросы, чем плоха конкатенация SQL запроса?
Опишу ситуацию, есть БД с несколькими таблицами, с которыми нужно совершать много разных операций...

SQL-запрос результатов другого SQL-запроса
Часто встречающийся пример: в первом запросе выполняется выборка по параметрам (к примеру, диапазон...


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

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

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