2013-08-10 11 views
5

Ho un modulo di ricerca per ottenere alcuni record. Uno del campo limitando per la forma è record, essendo una casella a discesa che assomiglia a questo:Campo SQL stampato come stringa

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

Poi quando cercano il seguente codice viene eseguito:

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(); 
} 

e che funziona perfettamente bene, ad eccezione per una cosa. Questo: $placeholders[':record'] = 'runs'; viene letteralmente stampato nell'SQL come "corre", anziché il campo runs prelevato dal database, quindi $record['record'] verrà stampato come "Esegui" per ogni voce, anziché il numero selezionato dalla tabella .

se le quotazioni sono sostituiti da "" si verifica la stessa cosa, e se sostituita da `` non succede nulla (risultato vuoto)

risposta

1

Si consiglia di non utilizzare i segnaposto per i nomi di tabella o campo. Utilizzare invece una variabile, il valore non deve essere comunque disinfettato.

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

Perfetto, grazie – cameronjonesweb

0

PDO prevede che i parametri associati siano valori, ad es. Clausole WHERE. Pertanto

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

non funzionerà come previsto. DOP crea dal

SELECT playerid, :record as record, user.usertitle 

qualcosa come

SELECT playerid, 'runs' as record, user.usertitle 

e cerca di eseguire.