我正在为这段代码的逻辑而苦苦挣扎。我认为使用后退按钮时会出现空白条目。它适用于残疾学习者的问卷系统,每页仅询问 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 中验证
如果您知道自己的数据并且不会更改,则可以使用 if 和 switch 语句进行验证。
这段代码看起来很像上面的代码,只是它不从数据库中获取数据,逻辑是硬编码的,或者存储在 php 数据结构中。
关于php - 避免提交给 sql 的空白和重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471925/
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
我在ruby表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St
Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject
保存成功后可以回滚吗?让我有一个带有属性名称、电子邮件等的用户模型。例如u=User.newu.name="test_name"u.email="test@email.com"u.save现在记录将成功保存在数据库中,之后我想回滚我的事务(不是销毁或删除)。有什么想法吗? 最佳答案 您可以通过交易来做到这一点,请参阅http://markdaggett.com/blog/2011/12/01/transactions-in-rails/例子:User.transactiondoUser.create(:username=>'Nemu