【问题标题】:PHP form validation submitting blank dataPHP表单验证提交空白数据
【发布时间】:2014-05-07 20:17:46
【问题描述】:

我正在尝试创建一个页面以允许用户使用 PHP 编辑他们的详细信息,该页面会在提交之前验证内容。 我想允许用户更新他们的用户名、名字和第二名以及电子邮件地址。

验证包括:

<?php
if(preg_match("/^[0-9a-zA-Z_]{3,}$/", $_POST["username"]) == 0)
$error_username = '<li>Usernames may contain only digits, upper and lower case letters and underscores</li>';

if(preg_match("/^[A-Za-z]+$/", $_POST["fname"]) == 0)
$error_fname = '<li>First Name may contain upper and lower case letters</li>';

if(preg_match("/^[A-Za-z]+$/", $_POST["sname"]) == 0)
$error_sname = '<li>Second Name may contain upper and lower case letters</li>';

if(preg_match("/^[a-zA-Z]\w+(\.\w+)*\@\w+(\.[0-9a-zA-Z]+)*\.[a-zA-Z]{2,4}$/", $_POST["email"]) == 0)
$error_email = '<li>Email Addresses must have a valid email address format</li>';

else header("Location: edit.php");  
?>

并显示错误:

<ul>
<?php  if(isset($error_username)) echo $error_username; ?>
<?php  if(isset($error_fname)) echo $error_fname; ?>
<?php  if(isset($error_sname)) echo $error_sname; ?>
<?php  if(isset($error_email)) echo $error_email; ?>
</ul>

我的表格是:

<form name="edit_account" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input class="form_field" name="username" type="text" value="<?php echo $_POST["username"]; ?>" placeholder="Username">
<input class="form_field" name="fname" type="text" value="<?php echo $_POST["fname"]; ?>" placeholder="First Name">
<input class="form_field" name="sname" type="text" value="<?php echo $_POST["sname"]; ?>" placeholder="Second Name">
<input class="form_field" name="email" type="text" value="<?php echo $_POST["email"]; ?>" placeholder="Email Address">
<input type="submit" name="Submit" value="Update Account">
</form>

如果满足验证的所有要求,用户将被带到edit.php,然后重定向到成功页面:

<?php
$sql = $mysqli; 
$id = htmlentities($_SESSION['user_id']); 

$username = $sql->real_escape_string($_POST['username']);
$fname = $sql->real_escape_string($_POST['fname']); 
$sname = $sql->real_escape_string($_POST['sname']);  
$email = $sql->real_escape_string($_POST['email']);

$query = ("
UPDATE users 
SET 
username='$username', 
fname='$fname', 
sname='$sname',
email='$email' 
WHERE id='$id'") ; 


$sql->query($query) or die($query.'<br />'.$sql->error); 
header ('Location: success.php');  
?>

当我尝试运行此代码时,更新字段作为空白提交到数据库中 - 但是,未经验证,用户提交的详细信息已成功输入。

有人可以指出是什么导致表单提交为空白。谢谢。

【问题讨论】:

  • 您的验证将无法通过许多合法的姓名和电子邮件地址
  • session_start(); 是否已加载到某处?由于您正在使用会话。如果没有,
  • @Fred-ii- 是的,它在文档的顶部
  • 我认为您应该在客户端而不是服务器端对输入进行任何验证
  • @MatthewJohnson 好点!

标签: php validation login


【解决方案1】:

看起来您正在从验证脚本重定向到 edit.php(其中包含数据库插入代码)。问题是 $_POST 变量在您重定向时被重置。

我会include('path/to/edit.php')edit.php 脚本而不是重定向到它。如果这不可能,我会将 $_POST 数据保存在 $_SESSION 变量中。

希望对你有帮助

【讨论】:

    【解决方案2】:

    您将它们发布到验证页面,但是当您重定向到 edit.php 页面时它们会丢失。在转到edit.php 之前将信息存储在会话变量中,如下所示:

    $_SESSION['username'] = $_POST["username"];
    // other variables also
    

    edit.php 上,不是从$_POST 拉取,而是从$_SESSION 拉取。

    旁注

    不要忘记每页顶部的session_start()。此外,您应该在使用用户输入时查看prepared statements

    【讨论】:

    • "mysql_ 函数已弃用"* -- ??? OP 正在使用mysqli。您不能将real_escape_stringmysql_* 函数一起使用。
    • 你是对的,现在正在编辑。每当我看到未准备好的语句时,我只是假设 mysql。很抱歉!
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2018-11-08
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2016-02-14
    相关资源
    最近更新 更多