2014-02-16 32 views
1

我需要在php中创建SQL更新语句,并且我的列名称需要是变量。 我从jQuery的AJAX POST方法这些变量和我有他们在PHP:SQL变量列中的PHP变量

$variable = $_POST['variable']; 
$row = $_POST['row']; 
$field = $_POST['field']; 

当我赞同他们,我得到正确的值,例如:

echo $variable; 
echo $row; 
echo $field; 

和我 - martins,2,名字。在我的数据库中,我有名字 - 名字的列。所以,我尽量让这个声明(我知道我需要使用事先准备好的声明,但那是另一个问题)

$sql = 'UPDATE ajax_example SET '.$field.'= "'.$variable.'" WHERE id = "'.$row.'"'; 
mysql_query($sql) or die (mysql_error()); 

如果我改变“ $领域。”名称 - firstname,那么更新成功,所以$变量和$行被正确定义,但我需要这个列名作为变量。我看过大约15个帖子,我已经尝试了每个软管代码,但没有任何内容。这真的不可能吗?

+0

让您远离输入变量,请不要用'mysql_'功能了,使用'mysqli_'或'PDO ' – JamesHalsall

+1

1.不要使用'mysql_'。他们被弃用(并且已经有几年)。使用'mysqli_'或'PDO'。其次,这段代码疯狂地不安全。 – h2ooooooo

+1

请你逃避你的输入变量。将它们直接传递给声明将打开经典攻击的大门,称为“SQL注入”。 – fuesika

回答

3

你需要逃避你的变数,给您的上下文一个基本的例子...

$conn = mysqli_connect(/* config */); 
$sql = 'UPDATE ajax_example SET ' . mysqli_real_escape_string($conn, $field).'= "' . mysqli_real_escape_string($conn, $variable) . '" WHERE id = "' . mysqli_real_escape_string($conn, $row) . '"'; 
mysqli_query($conn, $sql); 
+0

谢谢!这工作! :)但为什么逃生是如此必要?并且我应该使用PDO? PDO有一些非常大的优势? – user3316619

+0

@ user3316619准备好的语句总是优于将变量粘贴到查询中。见[mysql_real_escape_string'足以清理用户输入](http://stackoverflow.com/questions/2353666/php-is-mysql-real-escape-string-sufficient-for-cleaning-user-input)。 – h2ooooooo

+0

@ h2ooooooo'mysql_real_escape_string'是不够的,但'mysqli_real_escape_string'很好 - 因为它逃脱了你提供的连接 - 而'mysql_'变体没有 - PDO **更好,但它是一个与OP有什么大的偏差 – JamesHalsall