2015-04-06 2 views
0

Я создаю базу данных для игры, которую я работаю, и мне нужно, чтобы пользователи могли убить друг друга, так что я создал таблицу, как это:Подготовленные заявления с переменными столбцов

... 
`alive1` => Player 1's status 
`alive2` => Player 2's status 
`alive3` => Player 3's status 
`alive4` => Player 4's status 
... 

Мне нужно иметь возможность изменять эти столбцы в базе данных на основе каждого случая и с помощью ввода непосредственно от пользователя. Однако, что-то вроде этого:

$stmt = $link->prepare("UPDATE `games` SET `alive{$_GET["player"]}`=0 WHERE `id`=?") 

уязвим для SQL-инъекций. Есть ли способ «привязать» имя столбца к запросу, чтобы я мог безопасно модифицировать таблицу?

Правильный ввод для $ _GET ["player"] должен быть просто целым числом 1..4, поэтому, я думаю, я мог бы проверить вход непосредственно, если это необходимо, и убедиться, что это одна из этих четырех возможностей, но я надеялся, что будет более элегантное решение. Это может возникнуть позже в другом проекте, где набор возможных входных данных будет намного больше, а жесткое кодирование каждого случая будет очень трудоемким.

Любые идеи?

ответ

1

Идентификаторы не могут быть привязаны к подготовленному заявлению, поэтому вы должны их белым списком.

В целом для белого списка вы создаете массив действительных идентификаторов и проверяете, прошел ли он в списке. Например:

$validColumns = array('alive1', 'alive2', 'alive3', 'alive4'); 
$col = 'alive' . $_GET["player"]; 
$isSafeToUse = in_array($col, $validColumns); 

В вашем случае вы можете просто

$id = (int)$_GET["player"]; 

и проверить то, что $id находится в [1, 4] диапазоне.

+0

Я вижу, так что я будет просто делать что-то вроде 'if ($ id> 0 и $ id <5) // do statement'? – David

+0

@MathNerdProductions Yep. Я бы пошел с '$ id> = 1 && $ id <= 4'. – zerkms

+0

Отлично. Это очень помогает. Благодаря! – David

0

Я хотел бы использовать reguar выражение /^[1-4]$/

if(preg_match('/^[1-4]$/', $_GET['player'])){ 
    $stmt = $link->prepare('UPDATE `games` SET `alive' . $_GET['player'] . '` =0 WHERE `id`=?'); 
} else { 
    die; 
} 

Чтобы использовать это для будущих проектов, которые вы могли бы расширить это /^[0-9]{1,3}$/, что позволит вам принять ряд до 999

+0

'1 'lol ok' проведет эту проверку. – zerkms

+0

@zerkms oops fixed – cmorrissey

+0

Также удалите '{1,1}' – zerkms

Смежные вопросы