2010-01-22 25 views
6

Poniższy kod generuje tenwstawiania danych w bazie danych Oracle przy użyciu php

Warning: oci_execute() [function.oci-execute]: 
ORA-00911: invalid character in F:\wamp\www\SEarch Engine\done.php on line 17 

kod jest ...

<?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); 





?> 

Odpowiedz

12

Nigdy nie wstawiaj danych użytkownika bezpośrednio do SQL. Użyj oci_bind_by_name(), aby przygotować bezpieczną instrukcję. Jako efekt uboczny, to również naprawi błąd, który otrzymujesz (co jest literówką). Kod będzie wyglądać

$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); 
+0

Bardzo dużo. to działa. – user256938

0

Jest to raczej trudno powiedzieć, nie widząc co wygenerowany SQL wygląda, jaki zestaw znaków publikujesz i jakiego zestawu znaków używa baza danych.

Łączenie niefiltrowanej zawartości użytkownika z instrukcją SQL i wysłanie jej do DB jest receptą na katastrofę. Podczas gdy inne API DB w PHP mają funkcję ucieczki, IIRC to nie jest dostępne dla Oracle - powinieneś użyć powiązania danych.

C.

0

Trzeba apostrofów wokół varchar pól, które wstawiasz (które jak mniemam są url_name, anchor_text i opis). Pojedynczy cudzysłów, który obecnie właśnie tworzysz te wartości, ale w Oracle, pola varchar muszą mieć pojedyncze cudzysłowy wokół nich. Spróbuj tego:

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

nie mam PHP nigdzie go przetestować, ale to powinno stworzyć apostrofów wokół wartości.

Bo naprawdę sql będzie ostatecznie być wykonywany w bazie danych będzie wyglądać następująco:

insert into URL 
(
Url_ID, 
Url_Name, 
Anchor_Text, 
Description 
) 
VALUES 
( 
9, 
'My Name', 
'My Text', 
'My Description' 
) 

Artykuł główny Binding Variables in Oracle and PHP wydaje się być w dół, ale tutaj jest Google Cache Version, że idzie do szczegółów o tym, jak powiązać zmienne w PHP. Zdecydowanie chcesz robić to dla 1) wydajności i 2) bezpieczeństwa z SQL injection.

Również moje PHP jest nieco zardzewiały, ale wygląda na to, można również zrobić oryginalną instrukcję zapytania tak:

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

Edycja
Ponadto, trzeba uciec żadnych apostrofów, które mogą być obecne w danych, które otrzymujesz ze zmiennych formularza. W ciągu SQL sql należy przekonwertować pojedyncze cudzysłowy na 2 pojedyncze cudzysłowy, aby uciec od nich. Zobacz rozdział here zatytułowany "Jak wstawić ciągi zawierające cytaty?"

+0

Bardzo to działa ..... – user256938

+0

@sayket: Nie zapomnij oznaczyć odpowiedzi jako zaakceptowanej i/lub zagłosować, jeśli rozwiąże ona Twój problem. –

+0

thnkx, ale teraz widzę, że w rzeczywistości nie działa ..... wstawia {$ url_name}, {$ anchor_text}, {description} zamiast wartości przypisanych do tych zmiennych z $ _post method .... – user256938

0

Dzieje się tak, ponieważ w łańcuchu zapytania znajdują się nie cytowane znaki cudzysłowu. Spróbuj zamiast tego:

$sql1="insert into URL(Url_ID,Url_Name,Anchor_Text,Description) 
    VALUES(9,\".'{$url_name}'.\",\".'{$anchor_text}'.\",\".'{$description}'.\")"; 
1

Masz tu kilka problemów. Po pierwsze, zmienne nie są interpolowane na ciągi zawarte w apostrofach. Wypróbuj ten prosty skrypt, aby zobaczyć, co mam na myśli:

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

vs.

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

Po drugie, trzeba uciec zmiennych przed ich użyciem do skonstruowania kwerendy SQL. Pojedynczy znak "" w dowolnej zmiennej POST przerwie zapytanie, co spowoduje błąd składni Oracle.

Wreszcie, a może przede wszystkim, mam nadzieję, że to tylko przykładowy kod?Używasz niefiltrowanych danych wejściowych użytkownika do skonstruowania zapytania SQL, które pozostawia cię otwartym na ataki SQL injection. Ucieczka od zmiennych przynajmniej zapobiegnie najgorszemu rodzajowi ataków, ale powinieneś jeszcze dokonać walidacji. Nigdy nie używaj "zanieczyszczonych" danych do konstruowania zapytań.

0

Jeśli nadal rozpoczęciem opracowania, chcę sugerować użycie AdoDB zamiast oci_ funkcje bezpośrednio.

Kod powyżej może być zapisane w AdoDB takiego:

<?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 

W moim kodu powyżej, po prostu trzeba zrobić tablicę asocjacyjną z nazwą kolumny jako klucz, a następnie przypisać wartość dla Poprawna kolumna. Dane sanitarne są obsługiwane automatycznie przez AdoDB, więc nie musisz tego robić ręcznie dla każdej kolumny.

AdoDB to biblioteka z wieloma bazami danych, dzięki czemu można zmienić ustawienia danych przy minimalnej zmianie kodu w aplikacji.

Powiązane problemy