Php kullanarak Oracle veritabanına veri ekleme

6 Cevap php

Aşağıdaki kod, bu oluşturuyor

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

kod ...

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





?>

6 Cevap

Doğrudan SQL kullanıcı girişini sokmayın. oci_bind_by_name() güvenli bir bildiri hazırlamak için kullanın. Bir yan etki olarak, o da (bir alıntı yazım hatası olan) alıyoruz hatayı düzeltmek olacaktır. Kodu gibi görünecektir

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

Burada birkaç sorun var. İlk olarak, değişkenler tek tırnak içinde dizeleri yansıtılmadan değildir. Ne demek istediğimi görmek için bu basit bir script deneyin:

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

vs

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

İkincisi, bir SQL sorgusu oluşturmak için kullanmadan önce değişkenleri kaçmak gerekir. POST değişkenleri herhangi bir tek "'" karakteri size Oracle geçersiz sözdizimi hatası vererek, sorgu kıracak.

Son olarak ve belki de en önemlisi, bu sadece örnek kod umut? SQL enjeksiyon saldırıları için açık bırakır bir SQL sorgusu oluşturmak için filtresiz kullanıcı girişini kullanarak ediyoruz. Değişkenleri kaçan azından saldırıların kötü tür engeller, ancak hala bazı doğrulama yapmak gerekir. Sorguları oluşturmak için 'kusurlu' verilerini asla kullanmayın.

Bu gönderiyorsunuz ne charset gibi oluşturulan SQL benzediğini görmeden ve hangi veritabanı kullanıyor charset söylemek oldukça zor.

Yapıştırma filtresiz kullanıcı bir SQL deyimi içine içerik ve DB göndermeden felaket için bir reçetedir. PHP diğer DB API'ler, bir kaçış işlevi var IIRC bu Oracle için geçerli değil iken - veri bağlama kullanmalısınız.

C.

Eğer sorgu dizesinde un alıntılanan alıntı karakterler var çünkü bulunuyor. Bunun yerine bu deneyin:

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

(Ben url_name, anchor_text ve açıklama olduğunu varsayıyorum) Eğer eklediğiniz varchar alanları etrafında tek tırnak gerekir. Eğer şu anda sahip tek tırnak sadece bu değerleri bir dize yapmak ancak Oracle, varchar alanlar çevrelerindeki tek tırnak olması gerekir. Bu deneyin:

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

Bunu test etmek için bir yerde PHP zorunda değilsiniz, ama bu değerler etrafında tek tırnak oluşturmanız gerekir.

Sonunda veritabanında yürütme olacak gerçekten sql bu gibi görünecektir, çünkü:

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

Ana makale Binding Variables in Oracle and PHP Burada aşağı görünüyor ama Google Cache Version o PHP değişkenleri nasıl bağlanacağı hakkında ayrıntılı gider. Kesinlikle) 1 için bu yapıyor SQL enjeksiyon performansı ve 2) güvenlik istiyorum.

Ayrıca, benim PHP biraz paslı ama sen de böyle orijinal sorgu deyimi yapabileceği gibi görünüyor:

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

Edit
Also, you need to escape any single quotes that may be present in the data you receive from your form variables. In an Oracle sql string you need to convert single quotes to 2 single quotes to escape them. See the section here titled "How can I insert strings containing quotes?"

Eğer gelişmekte başlayarak hala varsa, ben yerine doğrudan oci_ fonksiyonların AdoDB kullanmak önermek istiyorum.

: Yukarıdaki kodu AdoDB Bunun gibi kullanılarak yeniden olabilir

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

Yukarıda benim kodda, sadece anahtar olarak sütun adı, bir ilişkisel dizi yapmak, ve sonra doğru sütun değeri atamak gerekir. Veri sanitasyon AdoDB tarafından otomatik olarak işlenir, böylece her bir sütun için elle yapmak zorunda değildir.

AdoDB çoklu veritabanı kütüphane, böylece databas uygulamanızda bir minimal bir kod değişikliği ile Enginge değiştirebilirsiniz.