gpt4 book ai didi

php - 避免提交给 sql 的空白和重复条目

转载 作者:可可西里 更新时间:2023-11-01 08:37:21 26 4
gpt4 key购买 nike

我正在为这段代码的逻辑而苦苦挣扎。我认为使用后退按钮时会出现空白条目。它适用于残疾学习者的问卷系统,每页仅询问 1 个问题,每个问题的结果单独提交。有一个单独的表用于确定调查是否已完全完成(我使用 GET 跟踪 uniqueID)并且结果仅来自完全完成的调查。

我曾尝试在存在 quesitonID 和唯一 ID 的地方使用更新响应/评论,但这似乎会产生更多问题。为了清楚起见并允许一些想法自由,我将代码削减到最低限度。非常感谢。

编辑:'response' 是单选按钮条目,'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());

}

最佳答案

您的代码不做任何验证,它只是在出现错误时
这不会在生产代码中执行。

就验证而言,您有 2 个选择:

A - 检查 php 中的输入并禁止任何非法值。
B - 使用 SQL 约束并监视那里的输出。
或者两者的结合。

选项 B 的问题是您只会从 MySQL 返回一个错误,您必须在 php 中处理该错误。
因此,我会选择选项 A。

第一步:转义您的输入
最好的方法是使用 PDO .
如果您使用 mysql_ 库,则必须在每个输入上使用 mysql_real_escape_string 来转义它并引用您的 $vars;像这样:

$a = mysql_real_escape_string($_GET['param1']);
examplequery = "SELECT * FROM table1 WHERE field1 = '$a' ";

对于整数值,您可以将变量转换为整数,然后在不带引号的情况下注入(inject)它。

$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 中验证
如果您知道自己的数据并且不会更改,则可以使用 ifswitch 语句进行验证。
这段代码看起来很像上面的代码,只是它不从数据库中获取数据,逻辑是硬编码的,或者存储在 php 数据结构中。

关于php - 避免提交给 sql 的空白和重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com