Вставка данных в базе данных оракула с помощью 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
задан APC 22 January 2010 в 17:53
поделиться

6 ответов

Это завернутый исключение и не очень интересно. Это корневая причина исключения, которое фактически говорит нам о корневой причине. Пожалуйста, смотри немного дальше в штабеле. Шанс большой, что вы тогда сталкиваетесь с SQLException: соединение отказано или SQLException: Connection Timed .

Если это верно в вашем случае, а затем все возможные причины:

  1. IP-адрес или имя хоста в URL JDBC неверно.
  2. имя хоста в URL JDBC не распознается локальным DNS-сервером.
  3. Номер порта отсутствует или неправильный в URL JDBC.
  4. Сервер БД снижается.
  5. DB Server не принимает соединения TCP / IP.
  6. Что-то между Java и DB блокирует соединения, например, брандмауэр или прокси.

Чтобы решить один или тот, следуйте следующим советам:

  1. Проверьте и проверьте их с помощью Ping .
  2. Обновите DNS или используйте IP-адрес в URL JDBC URL.
  3. Проверьте его на основе My.cnf MySQL DB.
  4. Начните его.
  5. Убедитесь, что MySQLD запущен без параметра - Skip-Networking .
  6. Отключить брандмауэр и / или настроить брандмауэр / прокси, чтобы разрешить / передать порт.

Кстати (и не связано с фактической проблемой), вам не обязательно нужно загружать драйвер JDBC на каждый GetConnection () вызов. Только один раз во время запуска достаточно.

-121--1146677-

Никогда не вставляйте ввод пользователя непосредственно в 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);
14
ответ дан 8 December 2019 в 16:02
поделиться

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

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

против.

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

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

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

1
ответ дан 8 December 2019 в 16:02
поделиться

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

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

c.

0
ответ дан 8 December 2019 в 16:02
поделиться

Вам нужны отдельные кавычки вокруг полей Varchar , которые вы вставляете (которые, как вы предполагаете, являются URL_NAME, anror_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
ответ дан 8 December 2019 в 16:02
поделиться

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

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

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) 
  VALUES( 9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")";
0
ответ дан 8 December 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: