2010-01-22 19 views
6

का उपयोग कर निम्न कोड पैदा कर रहा है इससम्मिलित करना डेटा php

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

कोड है ...

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





?> 

उत्तर

12

कभी भी SQL इनपुट में उपयोगकर्ता इनपुट डालें। एक सुरक्षित कथन तैयार करने के लिए oci_bind_by_name() का उपयोग करें। साइड इफेक्ट के रूप में, यह आपके द्वारा प्राप्त की जा रही त्रुटि को भी ठीक करेगा (जो एक उद्धरण टाइपो है)। कोड की तरह

$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

Thanx बहुत कुछ। यह काम कर रहा है। – user256938

0

यह उत्पन्न एसक्यूएल कैसा दिखता देखे बिना कहने के लिए नहीं बल्कि मुश्किल है, आप किस पोस्टसेट में पोस्ट कर रहे हैं और डेटाबेस का कौन सा अक्षरसेट उपयोग कर रहा है।

SQL क्वेरी में unfiltered उपयोगकर्ता सामग्री को विभाजित करना और डीबी को भेजना आपदा के लिए एक नुस्खा है। जबकि PHP में अन्य डीबी एपीआई में एक एस्केप फ़ंक्शन है, आईआईआरसी यह ओरेकल के लिए उपलब्ध नहीं है - आपको डेटा बाइंडिंग का उपयोग करना चाहिए।

सी

0

आप varchar क्षेत्रों है कि आप डालने कर रहे हैं (जो मुझे लगता है कर रहे हैं url_name, anchor_text, और विवरण) के आसपास एकल उद्धरण की जरूरत है। आपके द्वारा वर्तमान में एक सिंगल उद्धरण केवल उन मानों को स्ट्रिंग बना देता है लेकिन ओरेकल में, वर्चर्स फ़ील्ड को उनके चारों ओर एकल उद्धरण होना चाहिए। इसे आज़माएं:

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

मेरे पास इसका परीक्षण करने के लिए कहीं भी PHP नहीं है, लेकिन इसे आपके मूल्यों के चारों ओर एकल उद्धरण बनाना चाहिए।

वास्तव में एसक्यूएल आप अंततः डेटाबेस पर क्रियान्वित किया जाएगा इस प्रकार दिखाई देगा क्योंकि:

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

मुख्य लेख Binding Variables in Oracle and PHP नीचे प्रतीत होता है, लेकिन यहाँ Google Cache Version कि कैसे चर बाध्य करने के बारे में विस्तार में चला जाता है PHP में आप निश्चित रूप से 1) प्रदर्शन और 2) एसक्यूएल इंजेक्शन से सुरक्षा के लिए ऐसा करना चाहते हैं।

इसके अलावा, मेरी पीएचपी थोड़ा जंग लगी है, लेकिन लगता है कि आप भी इस तरह आपकी मूल क्वेरी बयान कर सकता है:
इसके अलावा, आप किसी भी एकल उद्धरण हो सकता है कि बचने के लिए की जरूरत है

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

संपादित करें आपके फॉर्म चर से प्राप्त डेटा में मौजूद है। ओरेकल एसक्यूएल स्ट्रिंग में आपको एकल उद्धरणों को उनसे बचने के लिए 2 सिंगल कोट्स में कनवर्ट करने की आवश्यकता होती है। शीर्षक here शीर्षक "मैं उद्धरण वाले तारों को कैसे सम्मिलित कर सकता हूं?"

+0

Thanx बहुत काम कर रहा है ..... – user256938

+0

@sayket: उत्तर को स्वीकार करने के लिए भूलना न भूलें और/या इसे आपकी समस्या हल करने पर वोट दें। –

+0

thnkx लेकिन अब मैं देखता हूं कि यह वास्तव में काम नहीं कर रहा है ..... यह $ _post विधि से इन चरों को आवंटित मानों के बजाय {$ url_name}, {$ anchor_text}, {description} डालने वाला है .... – user256938

0

ऐसा इसलिए है क्योंकि आपके पास क्वेरी स्ट्रिंग में उद्धृत उद्धरण वर्ण हैं। इसके बजाय इसे आजमाएं:

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

आपको यहां कुछ समस्याएं हैं। सबसे पहले, एकल कोट्स में संलग्न स्ट्रिंग्स में वेरिएबल्स को अलग नहीं किया जाता है। देखने के लिए मैं क्या मतलब है इस सरल स्क्रिप्ट का प्रयास करें:

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

बनाम

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

दूसरे, आप उन्हें प्रयोग एक SQL क्वेरी का निर्माण करने से पहले चर से बचने के लिए की आवश्यकता होगी। किसी भी पोस्ट वैरिएबल में एक एकल "'" वर्ण आपकी क्वेरी को तोड़ देगा, जिससे आपको ओरेकल से अमान्य वाक्यविन्यास त्रुटि मिल जाएगी।

आखिरकार, और शायद सबसे महत्वपूर्ण बात यह है कि मुझे उम्मीद है कि यह सिर्फ उदाहरण कोड है?आप SQL क्वेरी बनाने के लिए unfiltered उपयोगकर्ता इनपुट का उपयोग कर रहे हैं जो आपको SQL इंजेक्शन हमलों के लिए खोल देता है। चर से बचने से कम से कम सबसे खराब हमलों को रोक दिया जाएगा, लेकिन आपको अभी भी कुछ सत्यापन करना चाहिए। प्रश्न बनाने के लिए कभी भी 'दांतेदार' डेटा का उपयोग न करें।

0

लगेगा आप को विकसित करने शुरू करने में अभी भी कर रहे हैं, मैं सीधे AdoDBoci_ के बजाय कार्यों का उपयोग करने के लिए सुझाव देना चाहते।

आपका कोड ऊपर AdoDB इस तरह का उपयोग कर फिर से लिखा जा सकता है:

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

मेरी कोड में ऊपर, तो आप सिर्फ कुंजी के रूप में स्तंभ नाम के साथ एक साहचर्य सरणी बनाने के लिए, और फिर के लिए मान असाइन की जरूरत है सही कॉलम। डेटा स्वच्छता AdoDB स्वचालित रूप से संभाली जाती है, इसलिए आपको प्रत्येक कॉलम के लिए इसे मैन्युअल रूप से करने की आवश्यकता नहीं है।

AdoDB बहु-डेटाबेस लाइब्रेरी है, इसलिए आप अपने एप्लिकेशन में न्यूनतम कोड परिवर्तन के साथ डेटाबेस को बदल सकते हैं।

संबंधित मुद्दे