Вставка данных в базу данных oracle с помощью php

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

Warning: oci_execute() [function.oci-execute]: 
ORA-00911: invalid character in F:wampwwwSEarch Enginedone.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 ответов


никогда не вставляйте пользовательский ввод непосредственно в 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 - вы должны использовать привязку данных.

С.


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

$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 это подробно о том, как связывать переменные в 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: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 является библиотекой нескольких баз данных, поэтому вы можете изменить databas enginge с минимальным изменением кода в вашем приложении.