我在我的MySQL数据库中创建了TINYINT列来解释布尔变量,这些变量基于是否在数据库中检查了复选框是否在数据库中检查了值(0表示为false,其他一切为true)。但是在调用php文件时它不会更新值。我的SQL有问题吗? TINYINTs输入如下?只需使用0和1?
{{1}}
答案 0 :(得分:0)
通常,您希望在进行用户输入时参数化您的查询。您的问题是您输入的用户输入(或至少是潜在的用户输入)是列名称而不是值。 PHP正在将您的查询转换为以下内容:
UPDATE projectDB.Members
SET 'name'=1 WHERE username='currentUser'
这不符合您的要求(它告诉SQL更新名为'name'的字符串,而不是更新名为name
的列。)
如果您没有清理数据,那么您仍然存在风险 - 您基本上有两种选择:
在代码中添加可接受列名称的白名单;验证传入字符串是否与该白名单完全中的条目匹配,如果是,则将其用作列名称。这里的缺点是您的数据模型中的列名称散布在您的代码和HTML中。 e.g:
$chkcols['name1'] = true;
$chkcols['name2'] = true;
$chkcols['name3'] = true;
...
if ($chkcols[name] == true) ...;
或强>
想出一个不同的数据模型,可能就像EAV,你不必处理动态列名。这里的缺点是EAV可能是SQL中的一些反模式。这可能会使用如下查询:
UPDATE projectDB.Members SET Enabled = 1 WHERE name=:name AND username =:currentUser
;你可以,或者对EAV模型,有一个具有首选项的列或某种位掩码/列表(但同样,这是一个SQL反模式,因为你试图在一列中包含多条信息。