2010-01-22 20 views
6

El siguiente código está generando estaInsertar datos en la base de datos Oracle utilizando php

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

el código es ...

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





?> 

Respuesta

12

Nunca inserte la entrada del usuario directamente en SQL. Use oci_bind_by_name() para preparar una declaración segura. Como efecto colateral, eso también solucionará el error que está recibiendo (que es un error tipográfico que cita). El código se vería así

$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

Gracias mucho. esta funcionando. – user256938

0

Es bastante difícil decir sin ver lo que se ve como el SQL generado, qué conjunto de caracteres está publicando y qué juego de caracteres está usando la base de datos.

El empalme del contenido del usuario no filtrado en una declaración SQL y su envío a la base de datos es una receta para el desastre. Mientras que otras API de DB en PHP tienen una función de escape, IIRC esto no está disponible para Oracle; debe usar el enlace de datos.

C.

0

Necesitas comillas simples alrededor de las varchar campos que se está insertando (que supongo que son URL_NAME, anchor_text y descripción). La cita simple que tiene actualmente solo hace que esos valores sean una Cadena pero en Oracle, los campos varchar deben tener comillas simples alrededor de ellos. Intente esto:

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

No tengo PHP en cualquier lugar para probarlo, pero eso debería crear las comillas simples alrededor de sus valores.

Porque, en realidad el SQL es muy probable que se ejecutan en la base de datos se vería así:

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

El artículo principal Binding Variables in Oracle and PHP parece estar abajo, pero aquí es el Google Cache Version que entra en detalles sobre cómo enlazar las variables en PHP. Definitivamente quiere hacer esto para 1) rendimiento y 2) seguridad de inyección de SQL.

Además, mi PHP es un poco oxidado, pero parece que también podría hacer su declaración búsqueda original como esto:

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

Editar
Además, tiene que escapar ningún comillas simples que pueden ser presente en los datos que recibe de sus variables de formulario. En una cadena sql de Oracle, necesita convertir comillas simples a 2 comillas simples para escapar de ellas. Consulte la sección here titulada "¿Cómo puedo insertar cadenas que contengan comillas?"

+0

Muchas gracias, está funcionando ..... – user256938

+0

@sayket: No olvide marcar una respuesta como aceptada y/o votarla si resuelve su problema. –

+0

thnkx pero ahora veo que en realidad no funciona ..... está insertando {$ url_name}, {$ anchor_text}, {description} en lugar de los valores asignados a estas variables desde el método $ _post .... – user256938

0

Es porque tiene caracteres de comillas no citados en la cadena de consulta. Pruebe esto en su lugar:

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

Aquí tiene algunos problemas. En primer lugar, las variables no se interpolan en cadenas entre comillas simples. Prueba este sencillo script para ver lo que quiero decir:

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

vs

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

En segundo lugar, usted necesita para escapar de las variables antes de utilizarlas para construir una consulta SQL. Un solo carácter "'" en cualquiera de las variables POST interrumpirá su consulta, lo que le dará un error de sintaxis no válido de Oracle.

Por último, y quizás lo más importante, espero que esto sea solo un código de ejemplo?Está utilizando una entrada de usuario no filtrada para construir una consulta SQL que lo deja abierto a los ataques de inyección de SQL. Escapar de las variables evitará al menos el peor tipo de ataques, pero aún debe hacer una validación. Nunca use datos 'contaminados' para construir consultas.

0

Si usted todavía está en el inicio de desarrollo, quiero sugerir a utilizar en lugar de AdoDBoci_ funciones directamente.

Su código anterior se puede reescribir usando AdoDB así:

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

En mi código anterior, sólo tiene que hacer un arreglo asociativo, con el nombre de columna como la clave, y luego asignar el valor de la columna correcta. El saneamiento de datos es manejado por AdoDB automáticamente, por lo que no tiene que hacerlo manualmente para cada columna.

AdoDB es una biblioteca de bases de datos múltiples, por lo que puede cambiar los datos enginge con un cambio de código mínimo en su aplicación.

Cuestiones relacionadas