Php 避免向sql提交空白和重复条目
我正在与这段代码的逻辑作斗争。我认为空白条目是在使用后退按钮时发生的。这是针对残疾学生的问卷调查系统,每页只提出一个问题,每个问题的结果都单独提交。有一个单独的表格用于确定调查是否已完全完成。我使用GET跟踪一个唯一ID,结果仅来自那些完全完成的 我曾尝试在quesitonID和Unique ID存在的地方使用updateresponse/comment,但这似乎会产生更多问题。为了清晰起见,并允许思想自由,我将代码缩减到最低限度。非常感谢 编辑:“响应”是单选按钮条目,“注释”是文本输入UniqueID、surveyID、QID和type在URL中确定,并使用GET捕获Php 避免向sql提交空白和重复条目,php,mysql,database,logic,Php,Mysql,Database,Logic,我正在与这段代码的逻辑作斗争。我认为空白条目是在使用后退按钮时发生的。这是针对残疾学生的问卷调查系统,每页只提出一个问题,每个问题的结果都单独提交。有一个单独的表格用于确定调查是否已完全完成。我使用GET跟踪一个唯一ID,结果仅来自那些完全完成的 我曾尝试在quesitonID和Unique ID存在的地方使用updateresponse/comment,但这似乎会产生更多问题。为了清晰起见,并允许思想自由,我将代码缩减到最低限度。非常感谢 编辑:“响应”是单选按钮条目,“注释”是文本输入Uni
mysql_query("
INSERT INTO answers (uniqueID, surveyID, QID, type, response, comment)
SELECT '$U', '$S','$Q', '$t', '$response', '$comments'
")
or die(mysql_error());
if (isset($_GET['start'])) {
mysql_query("
INSERT INTO complete (uniqueID, surveyID)
VALUES('$U', '$S')
")
or die(mysql_error());
}
if (isset($_GET['finished'])) {
mysql_query("
UPDATE complete
SET timestamp = NOW()
WHERE uniqueID='$U'
")
or die(mysql_error());
}
如果您询问在插入重复值或空值时如何使mysql抱怨,答案是: uniqueID、surveyID、QID上的唯一约束以避免重复 避免空白值的NOTNULL约束 要阅读约束,请仔细阅读
但我也会在PHP中检查所提供的值是否存在并且格式是否正确。不要提及选择“$U”、“$S”、“$Q”、“$t”、“$response”、“$comments”编写查询的方式是非常危险的,因为它允许不同类型的代码注入。您的代码不进行任何验证,当出现错误时,它就会消失。 这在生产代码中不起作用 就验证而言,您有两种选择: A-检查php中的输入并禁止任何非法值。 B-使用SQL约束并监视那里的输出。 或者两者的结合 选项B的问题是,您只需要从MySQL返回一个错误,您必须用php处理这个错误。 出于这个原因,我会选择A选项 第一步:退出你的输入 最好的方法是使用。 如果使用mysql_uu库,则必须在每个输入上使用mysql_real_escape_字符串来转义它并引用$vars;像这样:
$a = mysql_real_escape_string($_GET['param1']);
examplequery = "SELECT * FROM table1 WHERE field1 = '$a' ";
对于整数值,可以将变量强制转换为整数,然后在不带引号的情况下将其插入
$a = intval($_GET['param1']);
$b = intval($_GET['param2']);
if $a > $b { list($a,$b) = array($b,$a); } //Exchange the two vars if needed.
examplequery = "SELECT * FROM table1 WHERE field1 BETWEEN $a AND $b";
验证您的数据
这里还有两个选项,您可以将验证硬编码到php中,或者使用SQL检查输入。
我喜欢第二种方法,因为它允许您将所有信息有效地输入到数据库中
使用验证表验证数据
一个选项是创建如下表:
table Checks (
fieldname varchar(50) not null,
tablename varchar(50) not null,
fieldtype enum('int','varchar','enum','decimal'.....) not null,
min_value double default -1000000;
max_value double default 1000000;
validation_query varchar(1000) default null,
primary key (tablename, fieldname)) ENGINE = InnoDB;
现在,您可以使用PDO检查这样的参数:
$stmt = $dbh->prepare("SELECT fieldtype, min_value, max_value, validation_query
FROM checks WHERE fieldname = ? AND tablename = ?");
$stmt->execute(array('field1', 'table1'));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
switch ($result['type']) {
case 'int':
$allOK = isnumeric($inputvalue_to_check);
$allOK = $allOK AND ($intval($inputvalue_to_check) >= $result['min_value']
AND $intval($inputvalue_to_check) <= $result['max_value']);
if is_null($result['validation_query']) {
$sql = $result['validation_query'];
$check = $dbh-?prepare($sql);
$check_result = $check->execute(array($inputvalue_to_check));
$check_result->fetch(PDO::FETCH_ASSOC);
if is_null($check_result['result']) { //value is not OK}
break;
case .......
php中的验证
如果您知道自己的数据,并且数据不会更改,那么可以使用If和switch语句进行验证。
此代码与上面的代码非常相似,只是它不从数据库中获取数据,而是硬编码逻辑或存储在php数据结构中 验证输入的代码在哪里?当您的代码没有实现这一点时,您希望如何避免重复和空值?我对验证感到困惑。您认为使用此系统的最佳方法是什么?非常感谢您提供的详细信息和努力。这将真正帮助我理解验证。