2010-01-26 3 views
-1

L'erreur suivante:problème avec l'insertion de données dans la base de données Oracle en utilisant PHP

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

est généré par ce code:

<?php 
include_once('config.php'); 
$db = oci_new_connect(ORAUSER,ORAPASS,"localhost/XE"); 

$url_name = $_POST['textfield']; 
$keyword_name = $_POST['textarea']; 
$url_type = $_POST['RadioGroup1']; 
$anchor_text = $_POST['textfield2']; 
$description = $_POST['textarea2']; 

$sql = "select seq_url1.nextval seq_url1 from dual"; 
$result = oci_parse($db,$sql); 

oci_execute($result); 
if($result) 
{ 
    while($row = oci_fetch_array($result)) 
    { 
     $temp = $row['SEQ_URL1']; 
     echo $temp; 
    } 
}   

$sql_url1 = 'INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) '.'VALUES($temp,:url,:type,:anchor,:description)'; 

$compiled = oci_parse($db, $sql_url1); 

oci_bind_by_name($compiled, ':url', $url_name); 
oci_bind_by_name($compiled, ':type', $url_Type); 
oci_bind_by_name($compiled, ':anchor', $anchor_text); 
oci_bind_by_name($compiled, ':description', $description); 

oci_execute($compiled); 
?> 

Ce qui pourrait être la cause?

+1

Eh bien, pouvez-vous nous montrer le caractère non valide et que les requêtes ressemblent quand ils sont envoyés à la base de données? –

+0

Je ne suis pas Oracle Guru, mais pourquoi avez-vous une période entre vos champs et votre instruction VALUES où vous définissez $ sql_url1? –

+0

@George - cette période est l'opérateur de concaténation PHP dans ce cas ... quant à * pourquoi * c'est là, je suis curieux aussi bien! –

Répondre

3

Cela pourrait être causé par la faute d'orthographe de « Description »:

$sql_url1='INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)... 
                   ^here 
+0

bon oeil! comme au baseball – Yada

0

Ma supposition est que le codage de votre formulaire Web, et l'encodage de votre base de données Oracle et/ou de connexion ne correspondent pas . mySQL écrit avec élégance le caractère brisé dans la table - peut-être que Oracle est plus strict. Mais d'abord, vérifiez si les observations de George Johnston ou de John Rasch ne sont pas exactes sur l'argent, et fournissez-nous quelques données de débogage à regarder.

1

Ce:

$sql_url1 = 'INSERT INTO URL1 
       (Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)'.' 
      VALUES 
       ($temp,:url,:type,:anchor,:description)'; 

... devrait être:

$sql_url1 = 'INSERT INTO URL1 
       (Url_ID,Url_Name,url_Type,Anchor_Text,Dscription)'.' 
      VALUES 
       (seq_url1.NEXTVAL,:url,:type,:anchor,:description)'; 

Vous n'avez pas besoin de deux requêtes pour effectuer l'opération, il suffit d'appeler le sequence.NEXTVAL dans l'instruction INSERT. La seule raison d'utiliser ce que vous avez, c'est si vous réutilisez cette valeur de séquence pour d'autres enregistrements.

En outre, il est possible que Dscription soit une faute de frappe qui ne correspond pas au nom de colonne réel. Confirmez en utilisant DESCRIBE URL1. Et vous pouvez essayer d'imprimer la requête avant qu'elle ne soit exécutée:

oci_bind_by_name($compiled, ':url', $url_name); 
oci_bind_by_name($compiled, ':type', $url_Type); 
oci_bind_by_name($compiled, ':anchor', $anchor_text); 
oci_bind_by_name($compiled, ':description', $description); 

echo $sql_url1 
0

Vous avez une variable PHP peu utilisée dans votre requête.

$sql_url1 = 'INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) VALUES($temp,:url,:type,:anchor,:description)'; 

Ici, la température de $ est destiné à vider tout l'entier, mais étant donné que la chaîne utilise des guillemets simples aucune substitution a lieu et oracle voit « temp $ » (ce qui est valable dans ce contexte). Passer à des guillemets doubles:

$sql_url1 = "INSERT INTO URL1(Url_ID,Url_Name,url_Type,Anchor_Text,Dscription) VALUES($temp,:url,:type,:anchor,:description)"; 

Ou prendre la suggestion ci-dessus et utiliser seq_url1.nextval. La description est mal orthographiée, mais cela entraînera une erreur de colonne inconnue, pas une erreur de caractère invalide.

Merci, Joe

Questions connexes