2009-08-07 13 views
9

के लिए PHP द्वारा तैयार कथन का उपयोग करने के लिए यह "When not to use Prepared statements?" पर एक समान प्रश्न है, लेकिन "कैसे करें" -part और PostgreSQL के लिए।पोस्टग्रेर्स

मुझे पता है कि मुझे तैयार कथन की आवश्यकता है क्योंकि मैं एक स्क्रिप्ट के दौरान अपने डेटाबेस में एक से अधिक कॉल करता हूं।

मैं typecasting पर following sentence

देखो के बारे में ठोस उदाहरण प्राप्त करने के लिए, मान्य और चर प्रतिबंध लगाया और तैयार बयान के साथ पीडीओ का उपयोग कर चाहते हैं।

मुझे पता है कि चर का सत्यापन और स्वच्छता करके उनका क्या मतलब है। हालांकि, मैं तैयार बयानों के बारे में पूरी तरह से यकीन नहीं कर रहा हूँ। हम कथन कैसे तैयार करते हैं? फ़िल्टर द्वारा, यह sanitizing द्वारा है? या कुछ पीडीओ परत से? परत की परिभाषा क्या है?

कथन में तैयार कथन का क्या अर्थ है? कृपया, ठोस उदाहरणों का उपयोग करें।

+0

आपके उत्तरों के लिए धन्यवाद! –

उत्तर

5

तैयार बयान बयान में क्या मतलब है?

documentation से:

यह सुविधा आदेशों बार-बार इस्तेमाल किया जाएगा पार्स किया जा सकता है और सिर्फ एक बार योजना बनाई है, न कि हर बार वे क्रियान्वित कर रहे हैं की तुलना में अनुमति देता है।

  • तैयार बयान क्यों करें:

    <?php 
    // Connect to a database named "mary" 
    $dbconn = pg_connect("dbname=mary"); 
    
    // Prepare a query for execution 
    $result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 
    
    // Execute the prepared query. Note that it is not necessary to escape 
    // the string "Joe's Widgets" in any way 
    $result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 
    
    // Execute the same prepared query, this time with a different parameter 
    $result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes")); 
    ?> 
    

    MySQL documentation for Prepared Statements अच्छी तरह से निम्नलिखित प्रश्नों के उत्तर देता:

    ऊपर लिंक पेज से देखें pg_prepare

    उदाहरण?

  • आपको तैयार कथन का उपयोग कब करना चाहिए?
+0

क्या आपके उदाहरणों में रोबोट की समान कार्यक्षमता है? वे रोबोट की तुलना में मेरे लिए बहुत स्पष्ट हैं। वह बहुत सारे सरणी का उपयोग करता है जो उन्हें मेरे लिए पढ़ना मुश्किल बनाता है। –

+1

@ मासी - मेरे द्वारा प्रदान किए गए उदाहरण pg_prepare दस्तावेज़ पृष्ठ से हैं। उनका पालन करना आसान है, लेकिन मैं कहूंगा कि @ ग्लास रोबोट के उदाहरण अधिक वास्तविक दुनिया हैं (उदाहरण के लिए, नामित मार्कर)। मेरा सुझाव है कि आप अपने हाथों को गंदे ASAP प्राप्त करें। उन सभी पर शासन करने के लिए कोई 'उदाहरण नहीं है'। – karim79

+1

आपका उत्तर पीडीओ का उपयोग नहीं करता है। यह मुझे सुझाव देता है कि आप पीडीओ के बिना तैयार बयान का उपयोग कर सकते हैं। पीडीओ केवल डेटाबेस आजादी की पेशकश करता प्रतीत होता है। –

0

हम बयान तैयारी कैसे करूं:

आप एक प्रश्न एक बार परिभाषित है, और यह जितनी बार विभिन्न मूल्यों के साथ की तरह के रूप में कहा जा सकता है।

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 
$result = pg_execute($dbconn, "my_query", array("row two")); 
$result = pg_execute($dbconn, "my_query", array("row three")); 

देखें (जैसे एक पाश में।): http://us2.php.net/manual/en/function.pg-execute.php

6

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

एक चर को एसक्यूएल में रखने के बजाय आप नामित या प्रश्न चिह्न मार्कर का उपयोग करते हैं जिसके लिए कथन निष्पादित होने पर वास्तविक मान प्रतिस्थापित किए जाएंगे। पीएचपी पुस्तिका से PDO की

परिभाषा:
'पीएचपी डेटा ऑब्जेक्ट (पीडीओ) विस्तार PHP में डेटाबेस तक पहुँचने के लिए एक हल्के, संगत इंटरफेस को परिभाषित करता।'

PDO और PDO::prepare पर PHP मैनुअल देखें।

नामित मार्कर के साथ एक तैयार बयान का एक उदाहरण:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = :username 
AND password = :pass"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password'])); 
$result = $sth->fetchAll(); 

प्रश्न चिह्न मार्कर के साथ एक तैयार बयान का एक उदाहरण:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = ? 
AND password = ?"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array($_POST['username'], $_POST['password'])); 
$result = $sth->fetchAll(); 
+0

आपके आदेशों का चयन करना प्रतीत होता है तालिका उपयोगकर्ताओं से कॉलम उपयोगकर्ता नाम और पासवर्ड, उदाहरण के लिए, उपयोगकर्ता नाम = ए और पासवर्ड = ए। यह मुझे बताता है कि कोड वास्तविक जीवन में व्यावहारिक नहीं है क्योंकि जब आप उन्हें पहले से जानते हैं तो दो स्तंभ-नामों का चयन करने में कोई समझ नहीं है। हालांकि, यदि आप दोनों के अनुसार तीसरा कॉलम चुनते हैं, तो आपका तरीका काम करने लगता है। ऐसा लगता है कि उपयोगकर्ता के इनपुट संसाधित होते हैं कि उपयोगकर्ता के इनपुट के साथ प्रश्नों के निष्पादन में विफलता/दुर्घटना मूल डेटा नहीं बदलती है, इसलिए कोई एसक्यूएल इंजेक्शन नहीं: उदाहरण के लिए, अगर तैयार करने में विफल रहता है तो रोकें ... –

0

उत्तर Karim79 के जवाब

यह करने के लिए

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1'); 

इस

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?'); 

निष्कर्ष के रूप में ही हो रहा है: जब से तुम sanitizing पर विचार करने की जरूरत नहीं है pg_prepare और pg_execute के उपयोग, पीएचपी और अधिक कुशल बनाता है। यह आपको पीडीओ के उपयोग में भी मदद करता है।

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