2015-03-04 2 views
0

Я следующий код PHP:Использование PDO с числами в сравнении строк

$comp1 = $_POST['cohort_id1']; 
$comp2 = $_POST['cohort_id2']; 
$comp3 = $_POST['cohort_id1']; 
$comp4 = $_POST['cohort_id2']; 

$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$sql = "SELECT cat_code, value, :comp1 , :comp2, round(:comp3/:comp4 * 100) as index_number FROM {$table}"; 
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
$stmt->execute(array(':comp1' => $comp1, ':comp2' => $comp2, ':comp3' => $comp3, ':comp4' => $comp4)); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
header('Content-type: application/json'); 
echo json_encode($result); 

Вот как один из объектов, возвращаемых:

?: "national_percent" 
cat_code: "edu" 
index_number: null 
value: "Some College" 

То, что я не могу понять, почему первый строка возвращает с «?», но что более важно, почему index_number имеет значение NULL. Я подозреваю, что это потому, что эти значения преобразуются в строки, но я не уверен, как с этим справиться.

+0

Чтобы указать типы свяжешь, прежде чем выполнить и не выполнять() без Params – developerwjk

+0

@developerwjk Не уверен, что я следую этому примеру, можете ли вы привести пример? – jonmrich

+0

См. [PDOStatement :: bindParam] (http://php.net/manual/en/pdostatement.bindparam.php) и [PDOStatement :: bindValue] (http://php.net/manual/en/pdostatement.bindvalue .php) – developerwjk

ответ

1

Чтобы предотвратить инъекции SQL пользовательского ввода, который содержит имена столбцов, проверьте вход на массив действительных имен столбцов:

$valid_columns = array('col1', 'col2', 'col3'); 
if (in_array($user_input_col, $valid_columns)) 
{ 
    $sql = "SELECT {$user_input_col} from table..."; 
    ... 
} 
else 
{ 
    die('Invalid column name'); 
} 
Смежные вопросы