【问题标题】:Insert Validation foreach loop trouble插入验证 foreach 循环故障
【发布时间】:2014-03-31 03:14:05
【问题描述】:

所以,我有以下代码:(暂时不要担心 SQL 注入/mysql 折旧)

$required = array('uexam_id', 'usubject', 'uexam_date');

$error = false;
//VALIDATION: first check all required fields are not empty. if post has values
if(!empty($_POST))
foreach($required as $field) 
    if ( empty($_POST[$field])) 
        $error = true;
//a field was empty, show error
if ($error) {
die ("All fields required!!! <a href='examisud.php'> Back to PHP Form </a>");
}
//no error - try the query
elseif($error === false && !empty($_POST) )

{
$InsertQuery = "INSERT INTO Exam (exam_id, subject, exam_date) VALUES ('$_POST[uexam_id]','$_POST[usubject]','$_POST[uexam_date]')";
$result = mysql_query($InsertQuery, $con) or die('query Failure:'. mysql_error());
}

所以当我导航到这个 php 表单 (examisud.php) 时,我首先会看到“所有必填字段”。然后我可以导航回表单,如果没有填写所有字段,它可以正常插入数据并显示错误。 *我怎样才能让“所需的所有字段”不显示在表单页面加载中,并且仅在我需要时显示(当字段留空时)。 当我还更新或删除字段时,我还会收到“所有必填字段”错误显示。但是,除了弹出错误之外,所有内容都会正常更新/删除。

所以基本上我只需要在插入查询中的字段留空时显示它! 提前感谢您能给我的任何帮助!

*编辑我的表单:

{
echo "<form action=examisud.php method=post>"; //HTML FORM ECHOED OUT BY PHP
echo "<tr>";
echo "<td>" . "<input type=text name=exam_id value=" . $record['exam_id'] . " </td>";
echo "<td>" . "<input type=text name=subject value=" . $record['subject'] . " </td>";
echo "<td>" . "<input type=text name=exam_date value=" . $record['exam_date'] . " </td>";
echo "<td>" . "<input type=hidden name=hidden value=" . $record['exam_id'] . " </td>";
echo "<td>" . "<input type=image name=update value=update id=submit src=images/update.png" . " </td>";
echo "<td>" . "<input type=image name=delete value=delete id=submit src=images/delete.png" . " </td>";
echo "</tr>";
echo "</form>";
}
echo "<form action=examisud.php method=post>";
echo "<tr>";
echo "<td><input type=text name=uexam_id></td>";
echo "<td><input type=text name=usubject></td>";
echo "<td><input type=text name=uexam_date></td>";
echo "<td>" . "<input type=image name=insert value=insert id=submit src=images/insert.png" . " </td>";
echo "</form>";
echo "</table>";

【问题讨论】:

  • 只需在表单上放置任何隐藏字段,并检查代码中是否存在隐藏变量 - 如果存在,则表单已提交,否则为“首次访问”
  • Don't worry about SQL injections/mysql depreciation for now: 不必担心的不是我们,你会:)

标签: php validation loops field required


【解决方案1】:

你必须检查表单是否提交

例如,如果您有这样的表单提交

<input type="submit" name="submit">

then in your php check it like this

if(!empty($_POST['submit']))//means the form is submitted
{
//your code
}
else
{
//no form is submitted here display your form normally
?>

<form action="" method="POST">
......
......
<input type="submit" name="submit">

</form>

<?php
}

希望对你有帮助,一切顺利

【讨论】:

  • 不,我的表单被 PHP 回显了,它不能以这种格式工作:/ 不过感谢您的输入!
  • 是的,您也可以在其他部分回显您的表单
【解决方案2】:

这段代码应该可以做到,下面有解释。

if ($_SERVER['REQUEST_METHOD'] == 'POST') { // check if the user submits data (POST) or just loads the page (GET)
    $error = false;
    $required = array('uexam_id', 'usubject', 'uexam_date');


    foreach($required as $field) {
        if (!isset($_POST[$field]) || empty($_POST[$field])) {
            $error = true;
            break;
        }
    }

    if ($error) {
        die("All fields required!!! <a href='examisud.php'> Back to PHP Form </a>");
    } else {
        $InsertQuery = "INSERT INTO Exam (exam_id, subject, exam_date) VALUES ('".mysql_real_escape_string($_POST["uexam_id"], $con)."','".mysql_real_escape_string($_POST["usubject"], $con)."','".mysql_real_escape_string($_POST["uexam_date"], $con)."')";
        $result = mysql_query($InsertQuery, $con) or die('query Failure:'. mysql_error());
    }
}

首先,您的代码存在一些严重的安全问题,不应在生产环境中使用。

mysql_* 函数是deprecated - 使用mysqli(与mysql 非常相似)或PDO_MYSQL。

您的代码容易受到SQL injection attacks 的攻击,请阅读this question 了解如何防止它们(正确转义值或使用准备好的语句)。

目前我使用mysql_real_escape_string 来转义变量,所以这段代码应该是安全的。

最后,我的代码仍应解决您的第一个问题,因为它会在运行验证之前检查用户是否实际提交表单(通过检查请求方法是否为POST),而您的第一个代码正在运行验证(并且失败),即使没有提交数据。

【讨论】:

  • 你可以至少使用mysql_real_escape_string
  • @Hanky웃Panky 是的,你是对的,更新了我的答案。起初我没有修复它,并希望在切换到 mysqli 或 PDO 时他会自己修复它。
  • @andre,我不知道该告诉你什么,我仍然得到完全相同的东西:/
  • 另外,这只是个人项目,不会上线,所以我不需要mysqli,也不必担心SQL注入=D
  • 代码以它应该的方式运行,除了当页面加载时,值被更新/删除我得到“所有字段都是必需的 - 返回表单”。然而插入了值,更新了数据库或删除了值,无论我做什么,它都会不断弹出。 ://
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多