Einfügen von Daten in Oracle-Datenbank mit PHP

Der folgende Code generiert dies

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

der Code ist ...

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





?>

Antworten auf die Frage(6)

dass die Abfragezeichen nicht in Anführungszeichen gesetzt sind. Versuchen Sie dies stattdessen:

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

wie das generierte SQL aussieht, in welchem Zeichensatz Sie posten und welchen Zeichensatz die Datenbank verwendet.

Ungefilterte Benutzerinhalte in eine SQL-Anweisung einzufügen und an die Datenbank zu senden, ist ein Rezept für eine Katastrophe. Während andere DB-APIs in PHP eine Escape-Funktion haben, ist diese für Oracle nicht verfügbar - Sie sollten die Datenbindung verwenden.

C.

einfache Anführungszeichen eingeschlossene Zeichenfolgen interpoliert. Versuchen Sie dieses einfache Skript, um zu sehen, was ich meine:

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

gegen

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

Zweitens müssen Sie die Variablen maskieren, bevor Sie sie zum Erstellen einer SQL-Abfrage verwenden. Ein einzelnes "'" Zeichen in einer der POST-Variablen unterbricht Ihre Abfrage und führt zu einem ungültigen Syntaxfehler von Oracle.

Zum Schluss, und vielleicht am wichtigsten, hoffe ich, dass dies nur ein Beispielcode ist. Sie verwenden ungefilterte Benutzereingaben, um eine SQL-Abfrage zu erstellen, die Sie für SQL-Injection-Angriffe offen lässt. Das Ausblenden der Variablen verhindert zumindest die schlimmsten Angriffe, Sie sollten jedoch trotzdem eine Überprüfung durchführen. Verwenden Sie niemals verdorbene Daten, um Abfragen zu erstellen.

Lösung für das Problem

Fügen Sie niemals Benutzereingaben direkt in SQL ein. Verwendenoci_bind_by_name () eine sichere Erklärung vorbereiten. Als Nebeneffekt behebt dies auch den Fehler, den Sie erhalten (was ein Tippfehler ist). Der Code würde so aussehen

$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);
 user25693824. Jan. 2010, 00:35
Vielen Dank. es funktioniert.

Sie benötigen einfache Anführungszeichen um dasvarchar Felder, die Sie einfügen (ich nehme an, URL-Name, Ankertext und Beschreibung). Das einfache Anführungszeichen, das Sie gerade haben, macht diese Werte zu einem String, aber in Oracle müssen varchar-Felder mit einfachen Anführungszeichen versehen sein. Versuche dies:

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

Ich habe nirgendwo PHP, um es zu testen, aber das sollte die einfachen Anführungszeichen um Ihre Werte erstellen.

Weil wirklich die SQL, die Sie irgendwann in der Datenbank ausführen werden, so aussehen würde:

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

Der HauptartikelVariablenbindung in Oracle und PHP scheint unten zu sein, aber hier ist dieGoogle Cache-Version das geht im Detail darüber, wie man Variablen in PHP bindet. Sie möchten dies auf jeden Fall tun, um 1) Leistung und 2) Sicherheit durch SQL Injection zu gewährleisten.

Mein PHP ist auch ein bisschen verrostet, aber es sieht so aus, als könnten Sie auch Ihre ursprüngliche Abfrageanweisung wie folgt ausführen:

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

Bearbeiten
Außerdem müssen Sie alle einfachen Anführungszeichen umgehen, die in den Daten enthalten sein können, die Sie von Ihren Formularvariablen erhalten. In einer Oracle-SQL-Zeichenfolge müssen Sie einfache Anführungszeichen in zwei einfache Anführungszeichen konvertieren, um sie zu umgehen. Siehe den AbschnittHier mit dem Titel "Wie kann ich Zeichenfolgen einfügen, die Anführungszeichen enthalten?"

 user25693822. Jan. 2010, 20:02
Vielen Dank, es funktioniert .....
 Doug Porter23. Jan. 2010, 04:31
@sayket: Der unten sollte funktionieren. Außerdem habe ich zusätzliche Informationen zum Ausblenden einzelner Anführungszeichen in die Informationen aus Ihrem Formular eingefügt.
 user25693823. Jan. 2010, 04:07
thnkx aber jetzt sehe ich, dass es tatsächlich nicht funktioniert ..... es fügt {$ url_name}, {$ anchor_text}, {description} anstelle der Werte ein, die diesen Variablen von der $ _post-Methode zugewiesen wurden ....
 Doug Porter22. Jan. 2010, 20:53
@sayket: Vergiss nicht, eine Antwort als akzeptiert zu markieren und / oder abzustimmen, wenn sie dein Problem löst.

möchte ich vorschlagen, zu verwendenAdoDB Anstatt vonoci_ funktioniert direkt.

Ihr Code oben kann mit umgeschrieben werdenAdoDB so was:

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

In meinem obigen Code müssen Sie nur ein assoziatives Array mit dem Spaltennamen als Schlüssel erstellen und dann den Wert für die richtige Spalte zuweisen. Die Datenbereinigung erfolgt durchAdoDB automatisch, so dass Sie es nicht für jede Spalte manuell tun müssen.

AdoDB ist eine Bibliothek mit mehreren Datenbanken, so dass Sie die Datenbank mit einer minimalen Codeänderung in Ihrer Anwendung ändern können.

Ihre Antwort auf die Frage