【问题标题】:PHP form does not get sent未发送 PHP 表单
【发布时间】:2013-12-10 22:11:18
【问题描述】:

我使用以下website 的代码为我的网站提供添加用户功能。我以前用过,效果很好。但是现在我已经改变了它并根据我的需要进行了修改。但是它似乎不起作用。我收到的错误消息是“请正确输入表格”,这是我在未发送各个字段时设置的消息(请参阅下面粘贴的代码)。我想这可能是我搞砸了,所以我尝试了网站的代码,但它不起作用。是wamp服务器设置的原因吗?还是cz

  1. 我正在检查是否只有用户名和密码以及会话表单令牌?
  2. 仅检查上述字段后,我将向数据库中添加更多信息 - 姓名、电子邮件 ID 等
  3. 我的数据库表的列数超过了我传递的值的数量。

由于我是 php 授权和验证的新手,所以我想不出任何可以调试的东西。任何帮助都将非常感激。我在下面发布我的 html 表单和 php 代码。我的 sql 表看起来有以下列:用户 ID、名字、姓氏、用户名、密码、电子邮件 ID、团队名称、金钱、总数、积分

html 表单 -

<?php
 
/*** begin our session ***/
session_start();
 
/*** set a form token ***/
$form_token = md5( uniqid('auth', true) );
 
/*** set the session form token ***/
$_SESSION['form_token'] = $form_token;
?>
 
<form class="form-inline" method="post" action="useradd.php" name="login_form">
              <p><input type="text" class="span2" name="firstname" id="firstname" placeholder="First Name"></p>
                          <p><input type="text" class="span2" name="lastname" id="Last Name" placeholder="Last Name"></p>
                          <p><input type="text" class="span2" name="username" id="username" placeholder="Username"></p>
                          <p class="help-block" style="font-size:12px"> Username should be between 4-20 characters long.</p>
              <p><input type="Password" class="span2" name="Password" placeholder="Password"></p>
                          <p class="help-block" style="font-size:12px"> Password must be between 4-20 characters long. Must be alpha-numeric</p>
                          <p><input type="Password" class="span2" name="Password" placeholder="Re-Enter Password"></p>
                          <p><input type="text" class="span4" name="emailid" id="emailid" placeholder="Emaid ID - example@example.com"></p>
                          <p><input type="text" class="span2" name="teamname" id="teamname" placeholder="Team name"></p>
                          <p class="help-block" style="font-size:12px"> Select your Unique team name.</p>
                          <p>
                  <select class="selectpicker">
                     <option>The name of the city where you were born</option>
                     <option>The name of your first pet</option>
                     <option>What is your mother's maiden name</option>
                  </select>
                </p>
                <p><input type="text" class="span2" name="secretanswer" id="secretanswer" placeholder="Secret Answer"></p>
                <p>
                                <input type="hidden" name="form_token" value="<?php echo $form_token; ?>" /><br />
              <p><button type="submit" class="btn btn-primary">Register</button></p>
            </form>

php代码-文件名-useradd.php

<?php
/*** begin our session ***/
session_start();

/*** first check that both the username, password, form token etc have been sent ***/
if(!isset( $_POST['username'], $_POST['password'], $_POST['form_token']))
{
    $message = 'work for the love of god';
}
/*** check the form token is valid ***/
elseif( $_POST['form_token'] != $_SESSION['form_token'])
{
    $message = 'Invalid form submission';
}
/*** check the username is the correct length ***/
elseif (strlen( $_POST['username']) > 20 || strlen($_POST['username']) < 4)
{
    $message = 'Incorrect Length for Username';
}
/*** check the password is the correct length ***/
elseif (strlen( $_POST['password']) > 20 || strlen($_POST['password']) < 4)
{
    $message = 'Incorrect Length for Password';
}
/*** check the username has only alpha numeric characters ***/
elseif (ctype_alnum($_POST['username']) != true)
{
    /*** if there is no match ***/
    $message = "Username must be alpha numeric";
}
/*** check the password has only alpha numeric characters ***/
elseif (ctype_alnum($_POST['password']) != true)
{
        /*** if there is no match ***/
        $message = "Password must be alpha numeric";
}
else
{
    /*** if we are here the data is valid and we can insert it into database ***/
    $firstname = filter_var($_POST['firstname'], FILTER_SANITIZE_STRING);
    $lastname = filter_var($_POST['lastname'], FILTER_SANITIZE_STRING);
    $username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
    $password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);
    $emailid = filter_var($_POST['emailid'], FILTER_SANITIZE_STRING);
    $teamname = filter_var($_POST['teamname'], FILTER_SANITIZE_STRING);
    $secret_question = filter_var($_POST['secret_question'], FILTER_SANITIZE_STRING);
    $secret_answer = filter_var($_POST['secret_answer'], FILTER_SANITIZE_STRING);
    

    /*** now we can encrypt the password ***/
    $password = sha1( $password );
    
    /*** connect to database ***/
    /*** mysql hostname ***/
    $mysql_hostname = 'localhost';

    /*** mysql username ***/
    $mysql_username = 'root';

    /*** mysql password ***/
    $mysql_password = 'imagination';

    /*** database name ***/
    $mysql_dbname = 'adb project';

    try
    {
        $dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
        /*** $message = a message saying we have connected ***/

        /*** set the error mode to excptions ***/
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        /*** prepare the insert ***/
        $stmt = $dbh->prepare("INSERT INTO users (firstname,lastname,username,password,emailid,teamname, secret_question,secret_answer ) VALUES (:firstname,:lastname,:username,:password, :emailid,:teamname,:secret_question,:secret_answer)");

        /*** bind the parameters ***/
        $stmt->bindParam(':firstname', $firstname, PDO::PARAM_STR);
        $stmt->bindParam(':lastname', $lastname, PDO::PARAM_STR);
        $stmt->bindParam(':username', $username, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR, 40);
        $stmt->bindParam(':emailid', $emailid, PDO::PARAM_STR);
        $stmt->bindParam(':teamname', $teamname, PDO::PARAM_STR);
        $stmt->bindParam(':secret_question', $secret_question, PDO::PARAM_STR);
        $stmt->bindParam(':secret_answer', $secret_answer, PDO::PARAM_STR);

        /*** execute the prepared statement ***/
        $stmt->execute();

        /*** unset the form token session variable ***/
        unset( $_SESSION['form_token'] );

        /*** if all is done, say thanks ***/
        $message = 'New user added';
    }
    catch(Exception $e)
    {
        /*** check if the username already exists ***/
        if( $e->getCode() == 23000)
        {
            $message = 'Username already exists';
        }
        else
        {
            /*** if we are here, something has gone wrong with the database ***/
            $message = 'We are unable to process your request. Please try again later"';
        }
    }
}
?>

<html>
<head>
<title>Login</title>
</head>
<body>
<p><?php echo $message; ?>
</body>
</html>

【问题讨论】:

  • 您确定收到“请正确输入表单”错误吗?我无法在您的代码中找到它。
  • @Babblo 很抱歉,我出于挫败感改成了“为上帝的爱工作”。它是我存储在$message 变量中的第一个字符串
  • 所以它正在工作。有什么问题?
  • 这是我在未发送表单详细信息时应该收到的消息。我想不出为什么会这样。检查useradd.php 代码最开始处的if isset 语句
  • 哎呀,对不起..我没看到!符号

标签: php html sql forms


【解决方案1】:

会是这样吗?

在表单中,name="Password" 上有一个大写的“P”,但在 useradd.php 中,您的 isset() 测试 $_POST["password"](小 p)

遇到这些类型的问题,我会立即尝试找出进程失败的确切位置,所以我通常会插入一堆echo "got to here 1";echo "got to here 2";,以便我知道脚本是否成功了这里没有了。

【讨论】:

  • 是的,这就是问题所在。我能够编辑它。现在我卡在第二条错误消息中
  • 首先,此时您可能不需要那个。首先让它全部工作(而且我从来没有使用令牌来验证表单......)无论如何,这可能是问题所在:uniqid('auth', true)uniqid() 函数不是 PHP 的一部分,所以它是本教程的一部分。也许那里有一个错字?无论如何,如果我是你,我会禁用/删除 elseif 并稍后再回来,如果有的话。
  • 基本上,第一个文件创建一个名为form_token 的字符串,并将其保存为会话变量(称为form_token)和隐藏字段。当发布到 useradd.php 时,它会根据几秒钟前设置的会话变量检查从隐藏字段接收到的内容。由您决定:这对您的锻炼至关重要吗?如果/当其他一切正常时,我会立即删除并返回它......(甚至可能不会)
  • 我认为 uniqid 可以作为 userid 存储在数据库中,以后可以在只有注册用户才能查看某些特定内容的情况下进行检查
  • 通常,我们将数据库的第一个字段设为“表名”ID(例如,“uid”表示用户表,“pid”表示产品表等)。我将其设置为 INT(11)、自动增量、PRIMARY 键(即索引列 - PRIMARY)。 是唯一的 user_id。不需要另一个。
【解决方案2】:

您在表单中定义了两次 name="Password"

【讨论】:

  • 那是“重新输入密码”字段。我删除它并再次尝试。没有运气
  • 我知道,但是您应该为小写的字段使用不同的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
相关资源
最近更新 更多