2012-08-13 9 views
5

के साथ MySQLi तैयार कथन मुझे IN ऑपरेटर का उपयोग कर डेटाबेस से कुछ पंक्तियों का चयन करना होगा। मैं तैयार कथन का उपयोग कर इसे करना चाहता हूं। यह मेरा कोड है:आईएस ऑपरेटर

<?php 
$lastnames = array('braun', 'piorkowski', 'mason', 'nash'); 
$in_statement = '"' . implode('", "', $lastnames) . '"'; //"braun", "piorkowski", "mason", "nash" 

$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN (?)'); 
$data_res->bind_param('s', $in_statement); 
$data_res->execute(); 
$result = $data_res->get_result(); 
while ($data = $result->fetch_array(MYSQLI_ASSOC)) { 
    ... 
} 
?> 

लेकिन कुछ भी नहीं लौटाता है हालांकि डेटाबेस में सभी डेटा मौजूद है।

और एक और: यदि मैं सीधे पूछताछ और निष्पादित करने के लिए $in_statement पास करता हूं, तो डेटा वापस कर दिया जाएगा। तो तैयारी पर समस्या दिखाई देती है।

मैं Google में प्रश्न की तलाश में था लेकिन यह 'सफल नहीं था। मेरे कोड में क्या गलत है?
मदद के लिए धन्यवाद!

$escaped_lastnames = join(',', array_map(array($_DB, 'real_escape_string'), $lastnames)); 

यह उचित स्ट्रिंग नक्शे:

+3

आप अपने इन क्लॉज के लिए एक एकल पैरामीटर का उपयोग नहीं कर सकते हैं। यह होना चाहिए: 'जहां अंतिम नाम IN (?,?,?,?) ' – andrewsi

+1

ठीक है, बहुत बहुत धन्यवाद!) यह थोड़ा बोझिल लगता है। – kpotehin

उत्तर

4

मुझे हाल ही में मेरे प्रश्न का समाधान मिला है। शायद यह करने का सबसे अच्छा तरीका नहीं है, लेकिन यह अच्छा काम करता है! मुझे गलत साबित करें :)

<?php 
$lastnames = array('braun', 'piorkowski', 'mason', 'nash'); 
$arParams = array(); 

foreach($lastnames as $key => $value) //recreate an array with parameters explicitly passing every parameter by reference 
    $arParams[] = &$lastnames[$key]; 

$count_params = count($arParams); 

$int = str_repeat('i',$count_params); //add type for each variable (i,d,s,b); you can also determine type of the variable automatically (is_int, is_float, is_string) in loop, but i don't need it 
array_unshift($arParams,$int); 

$q = array_fill(0,$count_params,'?'); //form string of question marks for statement 
$params = implode(',',$q); 

$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN ('.$params.')'); 
call_user_func_array(array($data_res, 'bind_param'), $arParams); 
$data_res->execute(); 
$result = $data_res->get_result(); 
while ($data = $result->fetch_array(MYSQLI_ASSOC)) { 
    ... 
} 

$result->free(); 
$data_res->close(); 
?> 
2

तैयार बयान वास्तव में से बचने के लिए क्या आप यह कर :)

इस आप इस चरण को लागू करने के काम करने के लिए प्राप्त करने के लिए बनाने के लिए कोशिश कर रहे हैं होती हैं $lastnames के प्रत्येक आइटम पर अपने डेटाबेस के लिए फ़ंक्शन से बचें। जब पूरा हो जाए, तो आप इस मान को सीधे क्वेरी में डालें, यानी बाध्य पैरामीटर का उपयोग किए बिना।

+0

धन्यवाद, जैक, लेकिन मुझे तैयार कथन के माध्यम से इस प्रश्न को करने का तरीका मिला। मैं call_user_func_array (सरणी ($ data_res, 'bind_param'), $ arParams का उपयोग कर रहा हूं; इसके बजाय नियमित bind_param। $ arParams में वेरिएबल्स के प्रकार और इन चरों को बिल्कुल ठीक किया गया है) – kpotehin

+0

बस मेरे कोड को उत्तर के रूप में पोस्ट किया गया है) – kpotehin

+2

@kpotehin निश्चित रूप से, यदि आपको वास्तव में इसके लिए तैयार कथन का उपयोग करना होगा, तो आप निश्चित रूप से :) व्यक्तिगत रूप से नहीं देख सकते लाभ, जब तक कि इसे एक पीएचपी निष्पादन –

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