Как вставить данные в базу данных оракула, используя php [duplicate]

Возможно, вы используете указатель мыши по умолчанию X. Попробуйте изменить его на что-то еще. Например, sudo apt-get install oxygen-cursor-theme и установите его в инструмент gnome-tweak.

6
задан 22 January 2010 в 21:53

5 ответов

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

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

vs.

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

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

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

1
ответ дан 15 August 2018 в 17:04

Если вы все еще начинаете разработку, я хочу предложить напрямую использовать функции 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
ответ дан 15 August 2018 в 17:04

Вам нужны одинарные кавычки вокруг полей 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')";

Edit Также вам нужно избегать любых одинарных кавычек, которые могут присутствовать в данных, которые вы получаете от ваших переменных формы. В строковой цепочке Oracle вам нужно преобразовать одинарные кавычки в 2 одинарные кавычки, чтобы избежать их. См. Раздел Переменные привязки в Oracle и PHP под заголовком «Как вставлять строки, содержащие кавычки?»

0
ответ дан 15 August 2018 в 17:04
  • 1
    Thanx много работает ..... – user256938 22 January 2010 в 23:02
  • 2
    @sayket: Не забудьте отметить ответ как принятый и / или проголосовать, если он решил вашу проблему. – Doug Porter 22 January 2010 в 23:53
  • 3
    thnkx, но теперь я вижу, что он фактически не работает ..... он вставляет {$ url_name}, {$ anchor_text}, {description} вместо значений, назначенных этим переменным из метода $ _post .... – user256938 23 January 2010 в 07:07
  • 4
    @sayket: Тот, который внизу, должен работать. Также я добавил дополнительную информацию об исключении одинарных кавычек в информации из вашей формы. – Doug Porter 23 January 2010 в 07:31

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

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

C.

0
ответ дан 15 August 2018 в 17:04

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

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) 
  VALUES( 9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")";
0
ответ дан 15 August 2018 в 17:04

Другие вопросы по тегам:

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