我正在想办法解决这个问题,因为表单的 post 参数是:answer1[2] 和 answer2[4]。括号内的数字代表其所属问题的id。我需要知道如何执行此操作的原因是它在提交空表单时不会返回答案错误。
if((empty($_POST['answer1'])) || (trim($_POST['answer1'])=="") || ($_POST['answer1'] == NULL) || (!isset($_POST['answer1']))){$errors = "yes";}
if((empty($_POST['answer2'])) || (trim($_POST['answer2'])=="") || ($_POST['answer2'] == NULL) || (!isset($_POST['answer2']))){$errors = "yes";}
// Error checking, make sure all form fields have input
if ($errors == "yes") {
// Not all fields were entered error
$message = "You must enter values to all of the form fields!";
$output = array('errorsExist' => true, 'message' => $message);
}
最佳答案
您写道您无法理解正在发生的事情。因此,让我们深入检查其中一个 if 子句:
if((empty($_POST['answer1'])) || (trim($_POST['answer1'])=="") || ($_POST['answer1'] == NULL) || (!isset($_POST['answer1']))) { ...
这可以更简单地写成:
if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") { ...
那是因为 NULL 值是 empty() 并且 !isset(...) 值也是空的。您已经在第一次检查过,因此无需再次检查。
然后就不需要在所有内容周围添加括号了。仅在实际需要时添加它们,以使您的代码更易于阅读。
让我们在此基础上修改代码:
if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") {$errors = "yes";}
if (empty($_POST['answer2']) || trim($_POST['answer2'])=="") {$errors = "yes";}
// Error checking, make sure all form fields have input
if ($errors == "yes") {
下一部分是 $errors 变量。没有必要让它说是和否,而你的意思是 true 或 false。接下来,应该为一切顺利的情况初始化变量。让我们稍微更改一下代码:
$errors = false;
if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") {$errors = true;}
if (empty($_POST['answer2']) || trim($_POST['answer2'])=="") {$errors = true;}
// Error checking, make sure all form fields have input
if ($errors) {
// Not all fields were entered error
$message = "You must enter values to all of the form fields!";
$output = array('errorsExist' => true, 'message' => $message);
}
现在代码看起来更容易找到您的实际错误。要找到错误,您需要检查哪些值实际提交到您的表单:
echo '<pre>', htmlspecialchars(print_r($_POST, true)), '</pre>'; die();
再次请求该页面,您将看到您提交了哪些数据,以便您检查是否错误检查了正确的字段。
另一种方法是期望所有提交都有错误。所以默认值为 true。然后只有当所有字段都验证时,$errors 才设置为 false。
因此,在您的情况下,如果您没有进行正确的错误检查,您的响应将始终不会返回任何错误,即使在实践中的表单也是如此。这就是为什么您应该控制错误检查是否真正起作用。
根据您在评论中的反馈,很明显您需要在 answer1 和 answer2 帖子字段中引用该项目。您只是检查了错误的字段。
因此只需将 $_POST['answer1'] 替换为 $_POST['answer1'][2] 即可,其他答案也一样。这是 answer1 的 if 子句示例:
if (empty($_POST['answer1'][2]) || trim($_POST['answer1'][2])=="") { ...
^^^ ^^^
只要始终测试正确的变量,它就会像预期的那样工作。
相关: How do I create a server-side form submission script that has client-side characteristics?
关于php - 不返回虚假表单提交的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431176/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee