我希望我的PHP web应用程序的用户能够插入一些表中的列,而不需要具有SQL知识的人。最好的方法是什么,显然SQL注入和id-10-t错误是一个令人担忧的问题。
我能不能用
sql = 'ALTER TABLE table_name ADD ? ?'然后以字符串的形式传入'new_col‘和'varchar(100)’?或者这超出了PDO的能力范围?
发布于 2012-12-18 10:11:43
不幸的是,您不能将ALTER TABLE语句中的列名或属性与PDO参数绑定。相反,为了防止SQL注入,我建议根据仅允许字母、数字和下划线的正则表达式来验证列名,并确保在语句中对列名进行反引号。
if (!preg_match('/^[a-z0-9_]+$/i', $column_name)) {
// Fail!!! submitted column name doesn't match regex
}^ = string[a-z0-9_]+的开头=一个或多个字母、数字,underscore$ = string/i的结尾= case-insensitive接下来,为了验证列的数据类型,您应该只允许一组特定的选项,并使用数组验证它们。这称为白名单。
// Allowed types:
$acceptable_types = array('VARCHAR(200)', 'VARCHAR(10)', 'INT', 'FLOAT', 'etc...');
if (!in_array($column_data_type, $acceptable_types)) {
// Fail!!! Invalid type submitted
}以上选项最好通过类似<select>列表的方式提供。您还可以指定额外的选项,如NULL / NOT NULL,作为构建ALTER TABLE语句的复选框输入。
// Only after everything is successfully validated:
$sql = "ALTER TABLE `tablename` ADD `$valid_column_name` $valid_column_datatype $NULL_option";发布于 2014-02-05 05:16:37
您可能需要考虑为其他列使用元表。
如果您为每种汽车设置了数据(如路缘重量、高度等),然后用户添加了其他特定信息,但这些信息并不适用于每辆汽车,则可以将其存储在单独的表中,如下所示:
车表: id name curb_weight height ...
元表: id (主键) car_id (外键) data_name data_value
Meta表与Car表具有一对多关系。如果用户想要为两辆特定的汽车添加一个列,以记录"size of mirror“或其他信息,Meta表将获得两条记录,分别是自动id、汽车id、”size of Mirror“和大小。
如果想要一组数据名列表,可以使用第三个表,并让元表存储id、car_id和data_id。
这只是一个想法!
发布于 2012-12-18 13:34:07
要允许用户在某些表中插入列,最好的方法显然是,而不是。特别是不需要具有SQL知识的人。
这是违反所有规则的。
将这样一个相当基本的问题与极其不同寻常的目标结合在一起,总是有一种糟糕设计的味道。
因此,正确的答案应该是:
https://stackoverflow.com/questions/13924689
复制相似问题