Вставка данных в базу данных Oracle с использованием php - PullRequest
6 голосов
/ 22 января 2010

Следующий код генерирует это

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 ]

13 голосов
/ 23 января 2010

Никогда не вставляйте пользовательский ввод напрямую в 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);
1 голос
/ 23 января 2010

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

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

против.

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

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

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

0 голосов
/ 24 января 2010

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

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

AdoDB - это библиотека с несколькими базами данных, так что вы можете изменить механизм базы данных с минимальным изменением кода в вашем приложении.

0 голосов
/ 23 января 2010

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

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) 
  VALUES( 9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")";
0 голосов
/ 22 января 2010

Вам нужны одинарные кавычки вокруг полей 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 , в которой подробно рассказывается о том, как связывать переменные в PHP. Вы определенно хотите сделать это для 1) производительности и 2) защиты от внедрения SQL.

Кроме того, мой PHP немного заржавел, но похоже, что вы могли бы также сделать свой оригинальный запрос следующим образом:

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) values ( 9, '$url_name', '$anchor_text', '$description')";

Редактировать
Кроме того, вам нужно избегать любых одинарных кавычек, которые могут присутствовать в данных, которые вы получаете от переменных формы. В SQL-строке Oracle вам нужно преобразовать одинарные кавычки в 2 одинарные кавычки, чтобы избежать их. См. Раздел здесь под названием «Как вставить строки, содержащие кавычки?»

0 голосов
/ 22 января 2010

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

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

С

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