2013-08-10 4 views
5

के रूप में मुद्रित किया जा रहा है मेरे पास कुछ रिकॉर्ड प्राप्त करने के लिए एक खोज फ़ॉर्म है। फार्म के लिए सीमित क्षेत्र में से एक record, एक ड्रॉपडाउन बॉक्स कि इस तरह दिखता है किया जा रहा है:SQL फ़ील्ड को स्ट्रिंग

<select name="record" id="record"> 
<option value="1">Highest Score</option> 
<option value="2">Most runs</option> 
</select> 

फिर जब वे निम्नलिखित कोड खोज चलाता है:

if (isset($_GET['action']) and $_GET['action'] == 'search') 
{ 
    include $_SERVER['DOCUMENT_ROOT'] . '/stats/includes/db.inc.php'; 

    $placeholders = array(); 

    if($_GET['record'] == '1'){ 
     $placeholders[':record'] = 'runs'; 
    } else if($_GET['record'] == '2'){ 
     $placeholders[':record'] = 'SUM(runs)'; 
    } 

    $select = 'SELECT playerid, :record as record, user.usertitle'; 
    $from = ' FROM cricket_performance p INNER JOIN user ON p.playerid = user.userid'; 
    $where = ' WHERE TRUE'; 

    if ($_GET['team'] != '') 
    { 
    $where .= " AND team = :team"; 
    $placeholders[':team'] = $_GET['team']; 
    } 

    if ($_GET['record'] != '') 
    { 
    $where .= " ORDER BY :record DESC"; 
    } 

    $where .= " LIMIT 10"; 

    try 
    { 
    $sql = $select . $from . $where; 
    $s = $pdo->prepare($sql); 
    $s->execute($placeholders); 
    } 
    catch (PDOException $e) 
    { 
    $error = 'Error fetching record'; 
    include 'form.html.php'; 
    exit(); 
    } 

    foreach ($s as $row) 
    { 
    $records[] = array('playerid' => $row['playerid'], 'record' => $row['record'], 'usertitle' => $row['usertitle'], '1' => $row['1']); 
    } 
    include 'form.html.php'; 
    exit(); 
} 

और वह पूरी तरह से ठीक काम करता है, को छोड़कर एक चीज़ के लिए। यह: $placeholders[':record'] = 'runs'; डेटाबेस से चुने गए runs फ़ील्ड के बजाय एसक्यूएल में 'रन' के रूप में काफी सचमुच मुद्रित किया जा रहा है, इसलिए $record['record'] को प्रत्येक प्रविष्टि के लिए 'रन' के रूप में मुद्रित किया जाएगा, तालिका के बाहर उठाए गए नंबर की बजाय ।

कोटेशन "द्वारा" एक ही बात होती है बदल दिया जाता है, और यदि `` द्वारा बदल दिया कुछ भी नहीं (खाली परिणाम)

उत्तर

1

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

"SELECT playerid, ".$field." as record, user.usertitle" 
+0

बिल्कुल सही, धन्यवाद – cameronjonesweb

0

पीडीओ बाध्य मानकों को मानों में मानने की अपेक्षा करता है उदा। कहां है। इसलिए

$s = $pdo->prepare($sql); 
$s->execute($placeholders); 

अपेक्षा के अनुसार काम नहीं करेगा। पीडीओ से

SELECT playerid, :record as record, user.usertitle 

कुछ

तरह
SELECT playerid, 'runs' as record, user.usertitle 

बनाता है और निष्पादित करने के लिए कोशिश करता है।

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