Следующий код генерирует это
Warning: oci_execute() [function.oci-execute]: ORA-00911: invalid character in F:\wamp\www\SEarch Engine\done.php on line 17
код …
<?php include_once('config.php'); $db = oci_new_connect(ORAUSER,ORAPASS,"localhost/XE"); $url_name=$_POST['textfield']; $keyword_name=$_POST['textarea']; $cat_news=$_POST['checkbox']; $cat_sports=$_POST['checkbox2']; $anchor_text=$_POST['textfield2']; $description=$_POST['textarea2']; $sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) VALUES( 9,".'{$url_name}'.",".'{$anchor_text}'.",".'{$description}'.")"; $result=oci_parse($db,$sql1); oci_execute($result); ?>
2<?php include_once('config.php'); $db = oci_new_connect(ORAUSER,ORAPASS,"localhost/XE"); $url_name=$_POST['textfield']; $keyword_name=$_POST['textarea']; $cat_news=$_POST['checkbox']; $cat_sports=$_POST['checkbox2']; $anchor_text=$_POST['textfield2']; $description=$_POST['textarea2']; $sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) VALUES( 9,".'{$url_name}'.",".'{$anchor_text}'.",".'{$description}'.")"; $result=oci_parse($db,$sql1); oci_execute($result); ?>
Никогда не вставляйте пользовательский ввод непосредственно в SQL. Используйте oci_bind_by_name (), чтобы подготовить безопасный оператор. В качестве побочного эффекта также будет исправлена ошибка, которую вы получаете (это оговорка о цитировании). Код будет выглядеть так:
$url_name = $_POST['textfield']; $anchor_text = $_POST['textfield2']; $description = $_POST['textfield3']; $sql = 'INSERT INTO URL(Url_ID,Url_Name,Anchor_Text,Description) '. 'VALUES(9, :url, :anchor, :description)'; $compiled = oci_parse($db, $sql); oci_bind_by_name($compiled, ':url', $url_name); oci_bind_by_name($compiled, ':anchor', $anchor_text); oci_bind_by_name($compiled, ':description', $description); oci_execute($compiled);
У вас здесь несколько проблем. Во-первых, переменные не интерполируются на строки, заключенные в одинарные кавычки. Попробуйте этот простой скрипт, чтобы понять, что я имею в виду:
$a = 'hi'; print 'Value: $a'; // prints 'Value: $a'
против
$a = 'hi'; print "Value: $a"; // prints 'Value: hi'
Во-вторых, вам нужно будет избежать переменных перед их использованием для построения SQL-запроса. Один символ «» в любой из POST-переменных разбивает ваш запрос, что дает вам неверную синтаксическую ошибку Oracle.
Наконец, и, возможно, самое главное, я надеюсь, что это всего лишь пример кода? Вы используете нефильтрованный ввод пользователя для построения SQL-запроса, который дает вам возможность открывать атаки SQL-инъекций. Выключение переменных, по крайней мере, предотвратит наихудший тип атак, но вы все равно должны сделать некоторые проверки. Никогда не используйте «испорченные» данные для построения запросов.
Трудно сказать, не видя, как выглядит сгенерированный SQL, какую кодировку вы публикуете и какую кодировку использует база данных.
Объединение нефильтрованного содержимого пользователя в оператор SQL и отправка его в БД – это рецепт катастрофы. В то время как другие API БД в PHP имеют функцию escape, IIRC это недоступно для Oracle – вы должны использовать привязку данных.
C.
Это связано с тем, что в строке запроса вы не указали кавычки. Попробуйте это вместо этого:
$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) VALUES( 9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")";
Вам нужны одинарные кавычки вокруг полей varchar
которые вы вставляете (я полагаю, это url_name, anchor_text и description). Единственная цитата, которую вы сейчас используете, только делает эти значения строкой, но в Oracle, поля varchar должны иметь одинарные кавычки вокруг них. Попробуй это:
$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) VALUES( 9,'".'{$url_name}'."','".'{$anchor_text}'."','".'{$description}'."')";
У меня нет PHP для тестирования, но это должно создавать одинарные кавычки вокруг ваших значений.
Поскольку действительно sql, который вы в конечном итоге выполняете в базе данных, будет выглядеть так:
insert into URL ( Url_ID, Url_Name, Anchor_Text, Description ) VALUES ( 9, 'My Name', 'My Text', 'My Description' )
Основная статья Переменные привязки в Oracle и PHP, похоже, не работают, но вот версия Google Cache Version , в которой подробно описывается, как связывать переменные в PHP. Вы определенно хотите сделать это для 1) производительности и 2) безопасности от SQL-инъекции.
Кроме того, мой PHP немного ржавый, но похоже, что вы также можете сделать свое исходное заявление запроса следующим образом:
$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) values ( 9, '$url_name', '$anchor_text', '$description')";
редактировать
Кроме того, вам нужно избегать любых одинарных кавычек, которые могут присутствовать в данных, которые вы получаете от ваших переменных формы. В строковой цепочке Oracle вам нужно преобразовать одинарные кавычки в 2 одинарные кавычки, чтобы избежать их. См. Раздел «Как вставлять строки, содержащие кавычки»?
Если вы все еще начинаете разработку, я хочу предложить напрямую использовать функции AdoDB вместо oci_
.
Ваш код выше можно переписать с помощью AdoDB следующим образом:
<?php include_once('config.php'); $url_name=$_POST['textfield']; $keyword_name=$_POST['textarea']; $cat_news=$_POST['checkbox']; $cat_sports=$_POST['checkbox2']; $anchor_text=$_POST['textfield2']; $description=$_POST['textarea2']; //do db connection $adodb =& ADONewConnection("oci8://ORAUSER:ORAPASS@127.0.0.1/XE"); if ( ! $adodb ) { die("Cannot connect to database!"); } //set mode $adodb->SetFetchMode(ADODB_FETCH_BOTH); //data for insert $tablename = 'URL'; $data['Url_ID'] = 9; $data['Url_Name'] = $url_name; $data['Anchor_Text'] = $anchor_text; $data['Description'] = $description; $result = $adodb->AutoExecute($tablename, $data, 'INSERT'); if ( ! $result ) { die($adodb->ErrorMsg()); return FALSE; } //reaching this line meaning that insert successful
2<?php include_once('config.php'); $url_name=$_POST['textfield']; $keyword_name=$_POST['textarea']; $cat_news=$_POST['checkbox']; $cat_sports=$_POST['checkbox2']; $anchor_text=$_POST['textfield2']; $description=$_POST['textarea2']; //do db connection $adodb =& ADONewConnection("oci8://ORAUSER:ORAPASS@127.0.0.1/XE"); if ( ! $adodb ) { die("Cannot connect to database!"); } //set mode $adodb->SetFetchMode(ADODB_FETCH_BOTH); //data for insert $tablename = 'URL'; $data['Url_ID'] = 9; $data['Url_Name'] = $url_name; $data['Anchor_Text'] = $anchor_text; $data['Description'] = $description; $result = $adodb->AutoExecute($tablename, $data, 'INSERT'); if ( ! $result ) { die($adodb->ErrorMsg()); return FALSE; } //reaching this line meaning that insert successful
В моем коде выше вам просто нужно создать ассоциативный массив с именем столбца в качестве ключа, а затем назначить значение для правильного столбца. Санитарная обработка данных обрабатывается AdoDB автоматически, поэтому вам не нужно делать это вручную для каждого столбца.
AdoDB – это библиотека с несколькими базами данных, поэтому вы можете изменить привязку баз данных с минимальным изменением кода в приложении.