Экрнирование символов в SPARQL запросе.

vladislafus

Новичок
Подскажите пожалуйста как заэкранировть символ ( < ) ? Сам запрос выглядит так:

PHP:
$inquery = "sparql           
INSERT DATA INTO <ns:User>
    {
    <ns:us1> ns:firstname"Иван".
    <ns:us1> ns:lastname"Иванов".
    <ns:us1> ns:grantname"Иванович".
    <ns:us1> ns:staff"Хирург".
    <ns:us1> ns:separation"Хирургическое".
            } ";

Передача значений из PHP (при этом используется подключение
через ODBC к базе SPARQL):
PHP:
       $first_name = $_POST['firstname'];
       $lastname = $_POST['lname'];
       $grant_name = $_POST['grantname'];
       $staff = $_POST['staff'];
       $separation = $_POST['separation'];
       $login = htmlspecialchars($_POST['login']);
       $pass = $_POST['password']; 
       
       $text = htmlspecialchars("<ns:User> ");
       $graph = $text;
       
       $text2 = htmlspecialchars("<ns:$login> ");
       $f1 =    htmlspecialchars("ns:firstname");
       $f2 =    htmlspecialchars("ns:lastname");
       $f3 =    htmlspecialchars("ns:grantname");
       $f4 =    htmlspecialchars("ns:staff");
       $f5 =    htmlspecialchars("ns:separation");
       
$query = "sparql INSERT DATA INTO $graph { 
$text2 $f1 \"$first_name\".
$text2 $f2 \"$lastname\".
$text2 $f3 \"$grant_name\".
$text2 $f4 \"$staff\".
$text2 $f5 \"$separation\".}";
PHP интерпритирует символ < как html тэг.
Функция htmlspecialchars не работает. После вывода через echo $query; в браузер передается нормальная строка с запросом, но htmlspecialchars убивает html тэг только для браузера, выражение <ns:User> в SQL запросе выглядит как &lt;ns:User&gt . Как решить эту проблему? Буду рад любому совету, помощи и подсказке.
 

Фанат

oncle terrible
Команда форума
в SQL запросах экранировать символ ( < ) не нужно
РНР никак не интерпретирует символы.
PHP не имеет ни малейшего представления об HTML

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

vladislafus

Новичок
в SQL запросах экранировать символ ( < ) не нужно
и РНР никак не интерпретирует символы. и от HTML он ничего не знает.
Знак ( < ) должен передатся текстом, а не как больше или меньше, потому что в SQL (я так понимаю) он используется как лог. функция. <ns:User> это название графа.
 

vladislafus

Новичок
в SQL запросах экранировать символ ( < ) не нужно
РНР никак не интерпретирует символы.
PHP не имеет ни малейшего представления об HTML

Если тебе нужен какой-то SPARQL, то, во-первых, так и надо писать, а во-вторых, чтобы что-то тебе ответить, надо знать синтаксис этого диковинного языка.
Какой диковинный язык? Это тоже SQL. Просто РНР работает с ним через odbc драйвер да и все.
 

Фанат

oncle terrible
Команда форума
Это никакой не SQL. в SQL угловые скобки не несут абсолютно никакой функции.

короче. Идешь в руководство по своему SPARQL и узнаёшь, как там экранировать угловые скобки. пхп к ним не имеет никакого отношения.
ферштеен?
 

vladislafus

Новичок
Это никакой не SQL. в SQL угловые скобки не несут абсолютно никакой функции.

короче. Идешь в руководство по своему SPARQL и узнаёшь, как там экранировать угловые скобки. пхп к ним не имеет никакого отношения.
ферштеен?
Да, чудесненько, а какого же при вызове строки
echo $query; угловые скобки не отображаются?
 

Фанат

oncle terrible
Команда форума
потому что ты выводишь свои каракули в браузер. который сиволы < интерпретирует. но к запросам не имет НИ МАЛЕЙШЕГО ОТНОШЕНИЯ
ферштеен?

теперь ты мне поверишь, наконец, что к РНР предъявлять претензии бесполезно?
а надо пойти, и как хороший мальчик, почитать документацию к своему языку?
 

vladislafus

Новичок
потому что ты выводишь свои каракули в браузер. который сиволы < интерпретирует. но к запросам не имет НИ МАЛЕЙШЕГО ОТНОШЕНИЯ
ферштеен?

теперь ты мне поверишь, наконец, что к РНР предъявлять претензии бесполезно?
а надо пойти, и как хороший мальчик, почитать документацию к своему языку?
Мегосовет
 

Фанат

oncle terrible
Команда форума
Я рад, что тебе понравилось.
Приступай к исполнению.
 

vladislafus

Новичок
Это никакой не SQL. в SQL угловые скобки не несут абсолютно никакой функции.

короче. Идешь в руководство по своему SPARQL и узнаёшь, как там экранировать угловые скобки. пхп к ним не имеет никакого отношения.
ферштеен?
Стоп. Как не несут? Например: SELECT * FROM Customers WHERE rating > 200;
 
  • Like
Реакции: eax

eax

#
Вот только htmlspecialchars, создана не для таких вещей, а чтобы браузер не интерпретировал html тэги, а отображал их как есть. (так например браузер отображает "&lt;" как "<"
На сколько я вижу, нужно как минимум экранировать кавычки и может угловые скобки, которые могут поступить из $_POST от недобросовестных пользователей.
Поэтому лучше воспользоваться регуляркой для валидации этих переменых. Ибо при использовании htmlspecialchars в базу просто будет писаться мусор.

Фанат, я что-то не так говорю?
 

fixxxer

К.О.
Партнер клуба
Ты несешь полнейшую чушь.

htmlspecialchars используется для преобразования произвольного текста в html entities для его вывода в _браузер_.
Ни к какому диалекту sql это не имеет НИКАКОГО отношения.

vladislafus: htmlspecialchars надо писать там, где ты выводишь В БРАУЗЕР. то есть echo htmlspecialchars($query). и больше нигде.
 

Фанат

oncle terrible
Команда форума
окей, не в самом SQL, а в строковых литералах SQL.
Знак ( < ) должен передаться текстом
Об этом я тебе и говорю все время. открой руководство по своему языку и узнай, каким образом в нем передаются тексты.
в SQL для этого текст заключается в кавычки и эти кавычки внутри текста соответственно экранируются.
Как это должно происходить в SPARQL я не имею ни малейшего представления.
 

vladislafus

Новичок
окей, не в самом SQL, а в строковых литералах SQL.

Об этом я тебе и говорю все время. открой руководство по своему языку и узнай, каким образом в нем передаются тексты.
в SQL для этого текст заключается в кавычки и эти кавычки внутри текста соответственно экранируются.
Как это должно происходить в SPARQL я не имею ни малейшего представления.
Я проверил и читал руководство. Не в SPARQL дело абсолютно. С английским языком скрипт работает и ломанные скобки никакой роли не играют. База SPARQL чудесно работает с UTF-8, я вносил вручную русские значения. Соответсвенно SELECT работает и PHP выводит данные. Проблема в INSERT, в создании динамического запроса. Он просит экранировать символы. UTF-8 страницы указан. База на UTF-8. В чем проблема? Возможная проблема с русским языком (я так думаю), то что он 2 байтный в отличии от 1 байтного инглиша.
Цитата из http://www.phpfaq.ru/slashes:
Есть и ещё одна причина: при использовании кодировки Unicode, которая приобретает всё большую популярность, а со временем займёт доминирующее положение в веб, волшебные кавычки могут попросту испортить текст, приняв часть мультибайтной строки за спецсимвол.
Но на каком этапе рубается передача? Не знаю, полный аут и как по-человечески её заэкранировать.
 

Фанат

oncle terrible
Команда форума
Он просит экранировать символы.
Кто просит?
В какой форме?
База SPARQL чудесно работает с UTF-8, я вносил вручную русские значения.
Что такое "вручную". Через форму в каком-то интерфейсе? Или полностью писал запрос в каком-то аналоге консоли?
Но на каком этапе рубается передача? Не знаю, полный аут и как по-человечески её заэкранировать.
не имею ни малейшего представления. правила экранирования данных в SPARQL мне неизвестны.
Разве что волшебные кавычки в любом случае могут портить твои данные и их лучше отключить. Но вообще они по умолчанию выключены.

В любом случае, тебе надо сначала разобраться ,каким образом в SPARQL разделяются команды и данные.
в SQL все просто - есть управляющие команды, а есть данные - строки и числа. Тексты передаются строками, специальным образом отформатированными. Каким образом передаются тексты в SPARQL, я, к сожалению, не имею ни малейшего представления.
 

eax

#
Для чистоты эксперимента, vladislafus, уберите везде htmlspecialchars.
Вы используете ODBC? напишите после запроса:
PHP:
echo odbc_errormsg();
запустите скрипт и расскажите о результатах.
 

vladislafus

Новичок
Для чистоты эксперимента, vladislafus, уберите везде htmlspecialchars.
Вы используете ODBC? напишите после запроса:
PHP:
echo odbc_errormsg();
запустите скрипт и расскажите о результатах.
Спасибо за совет конечно, но я с самого начала использовал эту функцию. Да и от htmlspecialchars давно отказался.
 

vladislafus

Новичок
Кто просит?
В какой форме?

Что такое "вручную". Через форму в каком-то интерфейсе? Или полностью писал запрос в каком-то аналоге консоли?

не имею ни малейшего представления. правила экранирования данных в SPARQL мне неизвестны.
Разве что волшебные кавычки в любом случае могут портить твои данные и их лучше отключить. Но вообще они по умолчанию выключены.

В любом случае, тебе надо сначала разобраться ,каким образом в SPARQL разделяются команды и данные.
в SQL все просто - есть управляющие команды, а есть данные - строки и числа. Тексты передаются строками, специальным образом отформатированными. Каким образом передаются тексты в SPARQL, я, к сожалению, не имею ни малейшего представления.
Фанат ты на этот SPARQL уже как бык на красную тряпку реагируешь, не надо мне было его упоминать. Проблема решаеться чудесной функцией base64_encode ну и соответсвенно base64_decode для обратного кодирования. Только вот данные в базе будут храниться в виде типа: 03ofj029j30d9c0. И потом работать "вручную" (то есть в интерфейсе SPARQL, система наз.Virtuoso, которая очень похожа на PHPMyAdmin) невозможно с этими данными, но это лучше, чем ничего. Мне главное чтобы интерфейс работал на web и нормально вносил данные и выводил их (что он и делает) да и все. SPARQL запрос (через ODBC) формируется по тем же правилам, что и SQL. Ничего военного или волшебного тут нету.
 

Breeze

goshogun
Команда форума
Партнер клуба
Проблема решаеться чудесной функцией base64_encode ну и соответсвенно base64_decode для обратного кодирования.
Это называется "подпер костылями". Не завидую тому, кто будет после тебя со всем этим разбираться.
 
Сверху