Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 避免向sql提交空白和重复条目_Php_Mysql_Database_Logic - Fatal编程技术网

Php 避免向sql提交空白和重复条目

Php 避免向sql提交空白和重复条目,php,mysql,database,logic,Php,Mysql,Database,Logic,我正在与这段代码的逻辑作斗争。我认为空白条目是在使用后退按钮时发生的。这是针对残疾学生的问卷调查系统,每页只提出一个问题,每个问题的结果都单独提交。有一个单独的表格用于确定调查是否已完全完成。我使用GET跟踪一个唯一ID,结果仅来自那些完全完成的 我曾尝试在quesitonID和Unique ID存在的地方使用updateresponse/comment,但这似乎会产生更多问题。为了清晰起见,并允许思想自由,我将代码缩减到最低限度。非常感谢 编辑:“响应”是单选按钮条目,“注释”是文本输入Uni

我正在与这段代码的逻辑作斗争。我认为空白条目是在使用后退按钮时发生的。这是针对残疾学生的问卷调查系统,每页只提出一个问题,每个问题的结果都单独提交。有一个单独的表格用于确定调查是否已完全完成。我使用GET跟踪一个唯一ID,结果仅来自那些完全完成的

我曾尝试在quesitonID和Unique ID存在的地方使用updateresponse/comment,但这似乎会产生更多问题。为了清晰起见,并允许思想自由,我将代码缩减到最低限度。非常感谢

编辑:“响应”是单选按钮条目,“注释”是文本输入UniqueID、surveyID、QID和type在URL中确定,并使用GET捕获

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数据结构中

验证输入的代码在哪里?当您的代码没有实现这一点时,您希望如何避免重复和空值?我对验证感到困惑。您认为使用此系统的最佳方法是什么?非常感谢您提供的详细信息和努力。这将真正帮助我理解验证。