2011-12-30 21 views
5
$sql='SELECT phrase,english FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage'])); 

उपरोक्त कोड ठीक चलता है। हालांकि मुझे एक और चर को तैयार कथन में रखना होगा। मैं निम्नलिखित की कोशिश की है, लेकिन यह काम करने के लिए प्रतीत नहीं होता:PHP पीडीओ + स्टेटमेंट तैयार करें

$sql='SELECT phrase,? FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['language'],$_POST['languagepage'])); 

मैं जानता हूँ कि $ _POST [ 'भाषा'] (यह मुद्रण से) केवल शब्द 'अंग्रेजी' में शामिल है। क्या चयन के इस हिस्से में एक तैयार चर डालना संभव है? एक स्तंभ नाम नहीं -

THX

+0

वाक्यविन्यास पर कोई त्रुटि नहीं लगता है, आपको क्या त्रुटि कोड मिला? – LotusH

+0

कोई त्रुटि नहीं - बल्कि इसके बजाय डीबी से मूल्य वापस प्राप्त करें, यह मुझे केवल अंग्रेजी शब्द देता है। डीबी में कॉलम के चर और शीर्षक में यह मान है ... – Adam

+0

उदाहरण: {"फ्री": "अंग्रेजी", "मिलिंगल्स": "अंग्रेजी", "सर्चप्रोफाइल": "अंग्रेजी"} लेकिन यह होना चाहिए विभिन्न मूल्य जहां अंग्रेजी शब्द है ... – Adam

उत्तर

7

क्वेरी पैरामीटर केवल एक निरंतर मूल्य की जगह ले सकते हैं।

सभी कॉलम और टेबल का नाम उस समय होना चाहिए जब आप एक क्वेरी तैयार करते हैं, तो आप बाद वाले निष्पादन चरण में कॉलम चुनने को स्थगित नहीं कर सकते हैं।

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

$lang_col_map = array(
    "DEFAULT" => "english", 
    "en"  => "english", 
    "es"  => "spanish" 
); 
$lang_col = $lang_col_map[ $_POST["language"] ] ?: $lang_col_map[ "DEFAULT" ]; 

$sql='SELECT phrase,$lang_col FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); 
$pds->execute(array($_POST['languagepage'])); 

इस तरह से आप यह सुनिश्चित करें कि केवल $ lang_col_map में मान SQL क्वेरी का हिस्सा बन सकते हैं, और उपयोगकर्ता कुछ भी http अनुरोध में मुश्किल भेजने का प्रयास करता है, यह है क्योंकि यह मेल नहीं खाता पर ध्यान नहीं दिया है हो सकता है उस मानचित्र की कोई भी कुंजी। तो क्वेरी एसक्यूएल इंजेक्शन से सुरक्षित है।

अधिक जानकारी के लिए मेरी प्रस्तुति SQL Injection Myths and Fallacies देखें।

+0

डिज़ाइन द्वारा, सभी प्रश्न/प्रश्न पूछे जाने से पहले ज्ञात होना चाहिए। – Xeoncross

2

तैयार कथन केवल पैरामीटर का समर्थन करता है जो डेटाबेस द्वारा समर्थित मान हैं।

आपके दूसरे कथन में, पहला "?" कॉलम नाम के लिए प्लेसहोल्डर है, न कि मूल्य।

आपको इसके बजाय एक गतिशील SQL कथन का उपयोग करना होगा। इसके लिए, आपको SQL इंजेक्शन से रोकना होगा।

$language_authorized = array('english', 'french', 'spanish'); 
$language = $_POST['language']; 
if (in_array($language_authorized, $language)) { 
    $sql='SELECT phrase,'.$language.' FROM static_site_language WHERE page=?;'; 
    $pds = $database->pdo->prepare($sql); 
    $pds->execute(array($_POST['languagepage'])); 
} 
संबंधित मुद्दे