Вставка данных в базу данных 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
Author: APC, 2010-01-22

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);
 12
Author: Max Shawabkeh, 2012-12-18 23:27:01

У вас здесь несколько проблем. Во-первых, переменные не интерполируются в строки, заключенные в одинарные кавычки. Попробуйте этот простой скрипт, чтобы понять, что я имею в виду:

$a = 'hi';
print 'Value: $a'; // prints 'Value: $a'

Против.

$a = 'hi';
print "Value: $a"; // prints 'Value: hi'

Во-вторых, вам нужно будет экранировать переменные, прежде чем использовать их для построения SQL-запроса. Один символ "'" в любой из переменных POST приведет к прерыванию вашего запроса, что приведет к недопустимой синтаксической ошибке Oracle.

Наконец, и, возможно, самое главное, я надеюсь, что это всего лишь пример код? Вы используете нефильтрованный пользовательский ввод для создания SQL-запроса, который оставляет вас открытым для атак с использованием SQL-инъекций. Экранирование переменных, по крайней мере, предотвратит наихудшие виды атак, но вы все равно должны провести некоторую проверку. Никогда не используйте "испорченные" данные для построения запросов.

 1
Author: Paul Osman, 2010-01-23 08:19:21

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

Объединение нефильтрованного пользовательского контента в инструкцию SQL и отправка его в БД - это путь к катастрофе. В то время как другие API-интерфейсы БД в PHP имеют функцию escape, IIRC это недоступно для Oracle - вы должны использовать привязку данных.

C.

 0
Author: symcbean, 2010-01-22 17:37:02

Это потому, что в строке запроса есть символы кавычек без кавычек. Попробуйте вместо этого:

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) 
  VALUES( 9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")";
 0
Author: wallyk, 2010-01-23 03:17:24

Вам нужны одинарные кавычки вокруг полей 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 одинарные кавычки, чтобы избежать их. Смотрите раздел здесь под названием "Как я могу вставлять строки, содержащие кавычки?"

 0
Author: Doug Porter, 2010-01-23 03:30:24

Если вы все еще находитесь в начале разработки, я хочу предложить использовать 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 - это библиотека с несколькими базами данных, поэтому вы можете изменять базы данных с минимальным изменением кода в своем приложении.

 0
Author: Donny Kurnia, 2010-01-24 00:06:03