Вставка данных в базу данных oracle с использованием php
Следующий код генерирует это
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);
?>
6 answers
Никогда не вставляйте пользовательский ввод непосредственно в 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 и описание). Одинарная кавычка, которая у вас есть в настоящее время, просто делает эти значения строкой, но в 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, в которой подробно рассказывается о том, как привязывать переменные в PHP. Вы определенно хотите делать это для 1) производительности и 2) безопасности от внедрения SQL.
Кроме того, мой PHP немного заржавел, но похоже, что вы также могли бы выполнить свою исходную инструкцию запроса следующим образом:
$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) values ( 9, '$url_name', '$anchor_text', '$description')";
Редактировать
Кроме того, вам необходимо избегайте любых одинарных кавычек, которые могут присутствовать в данных, которые вы получаете из переменных формы. В строке Oracle sql вам нужно преобразовать одинарные кавычки в 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:[email protected]/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 - это библиотека с несколькими базами данных, поэтому вы можете изменять базы данных с минимальным изменением кода в своем приложении.