【问题标题】:session form data across multiple pages and insert into mysql?跨多个页面的会话表单数据并插入到mysql中?
【发布时间】:2013-02-14 05:54:17
【问题描述】:

有人可以帮帮我吗,我正在尝试提交超过 3 页的表格。每个都有 3 个文本区域字段,我使用 session start 来回显其他页面的表单数据。

所以最后我要做的就是回显表单数据并将其插入 mysql 表 ptb_registrations。

由于某种原因,尽管它无法正常工作并且我收到了更新数据库错误的错误。我已经为此工作了几个小时,我很抱歉地说,我想不通。请有人帮助我,告诉我哪里可能出错了。

第 1 页:

<?php
session_start();
?>

<form class="" method="post" action="register_p2.php">
<input type="text" id="first_name" name="first_name" placeholder="First Name" />
<input type="text" id="last_name" name="last_name" placeholder="Last Name" />
<input type="email" id="email" name="email" placeholder="Email"  />
<input type="submit" value="Next >"  />
</form>

第 2 页:

<?php
session_start();
// other php code here

$_SESSION['first_name'] = $first_name;
$_SESSION['last_name'] = $last_name;
$_SESSION['email'] = $email;
?>
<form name="myForm" method="post" action="register_p3.php" onsubmit="return validateForm()" >
<input type="text" id="date_of_birth" name="date_of_birth" placeholder="D.O.B 10/02/1990" />
<input type="text" id="number" name="number" placeholder="Mobile Number" />
<input type="text" id="confirm" name="confirm" placeholder="Are You a UK resident?"  />
<input type="submit" value="Next >"  />
</form>

第 3 页:

<?php
session_start();
// other php code here

$_SESSION['first_name'] = $first_name;
$_SESSION['last_name'] = $last_name;
$_SESSION['email'] = $email;
$_SESSION['dat_of_birth'] = $date_of_birth;
$_SESSION['number'] = $number;
?>

<form class="" method="post" action="register_p4.php">
<input type="text" id="display_name" name="date_of_birth" placeholder="Display Name" />
<input type="password" id="password" name="password" placeholder="Password" />
<input type="password" id="password2" name="password2" placeholder="Password (Confirm)"  />
<input type="submit" value="Next >"  />
</form>

第4页:(mysql函数)

<?php
session_start();
// other php code here

$_SESSION['first_name'] = $first_name;
$_SESSION['last_name'] = $last_name;
$_SESSION['email'] = $email;
$_SESSION['dat_of_birth'] = $date_of_birth;
$_SESSION['number'] = $number;
$_SESSION['display_name'] = $display_name;
$_SESSION['password'] = $password;
?>

<?php
////// SEND TO DATABASE


/////////////////////////////////////////////////////////

// Database Constants
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "database");

// 1. Create a database connection
$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
if (!$connection) {
    die("Database connection failed: " . mysql_error());
}

// 2. Select a database to use
$db_select = mysql_select_db(DB_NAME,$connection);
if (!$db_select) {
    die("Database selection failed: " . mysql_error());
}
//////////////////////////////////////////////////////////////
$query="INSERT INTO ptb_registrations (ID,
first_name,
last_name,
email,
date_of_birth,
contact_number,
display_name,
password
 )
VALUES('NULL',
'".$first_name."',
'".$last_name."',
'".$email."',
'".$date_of_birth."',
'".$number."',
'".$display_name."',
'".$password."'
)";
mysql_query($query) or die ('Error updating database');
?>
<?php
function confirm_query($result_set) {
                if (!$result_set) {
                    die("Database query failed: " . mysql_error());
                }
        }
function get_user_id() {
    global $connection;
    global $email;
    $query = "SELECT *
                FROM ptb_registrations
                WHERE email = \"$email\"
                ";
        $user_id_set = mysql_query($query, $connection);
        confirm_query($user_id_set);
        return $user_id_set;
        }
?>
<?php
$user_id_set = get_user_id();
while ($user_id = mysql_fetch_array($user_id_set)) {
    $cookie1 = "{$user_id["id"]}";
    setcookie("ptb_registrations", $cookie1, time()+3600);  /* expire in 1 hour */

}
?>

<?php include ('includes/send_email/reg_email.php'); ?>

<? ob_flush(); ?>

【问题讨论】:

  • 通过 $_POST['First_Name'] 您必须在第二页中捕获该值,而不是将其称为变量
  • 你是从哪里学来的?这看起来充满了SQL injection bugs,这会使将其放在互联网附近的任何地方都非常危险。
  • 如果我不得不猜测数据库错误 - 不要在插入中提供 ID。取出ID和“null”。
  • 使用 $_POST[] 而不是仅使用 $variabale_name。

标签: php mysql


【解决方案1】:

请有人帮助我,告诉我哪里可能出错了。

您的代码本身太可怕了。 因为

1) 你混合了会话和数据库的职责

2) 您使用mysql_query() 来处理您不期望结果集的查询。对于INSERT, UPDATE, DELETE 查询应使用mysql_unbuffered_query()

3) 不要使用mysql_real_escape_string() 转义值,以免受到 SQL 注入的攻击

4) 你使用过程代码和全局状态

5) 您使用已弃用的 mysql_* 函数而不是 PDOMySQLi

6) 你在这里使用字符串连接而不是sprintf()

 )
 VALUES(
    '".$first_name."',
    '".$last_name."',
    '".$email."',
    '".$date_of_birth."',
    '".$number."',
    '".$display_name."',
    '".$password."'

7) 您没有验证 $_SESSION$_POST 中的任何内容。如果您设置了变量但它们不存在怎么办?

8) 您的查询验证错误,这里:confirm_query($result_set) {..

我最好停在这里。

因此,您不必以这种方式编码,而是将职责分开。

对于会话,它应该如下所示:

文件session.php

function seesion_init(){
   if ( session_id() == '' ){
     return session_start();
   } else {
     return true;
   }
}

function session_set(array $values){
  foreach($values as $key => $val){
     $_SESSION[$key] = $val;
  }
}

/**
 * It will give you a confidence that you get an existing value
 * @param string $key
 */
function session_get($key){
    if ( isset($_SESSION[$key]) ){
         return $_SESSION[$key];
    } else {
       throw new RuntimeException(sprintf('Accessed to non-existing session variable %s', $key));
    }
}

文件:dbconnection.php

<?php

define('HOST', '...');
define('USER', '...');
...


function connect(){

   if ( ! mysql_connect(...) ){
      die('...');
   }

   if ( ! mysql_select_db('DB_NAME_HERE') ){
       die('...');
   }
}


function query($query){
  return mysql_query($query); //<- Should only be used for SELECT queries
}


function ub_query($query){
   return mysql_unbuffered_query($query); // <- Should only be used for INSERT, DELETE, UPDATE queries
}

function fetch($result){
  return mysql_fetch_assoc($result);
}

文件:users.php

require_once('dbconnection.php');

connect();

/**
 * Returns user id by his username
 * 
 * @return array on success
 *         FALSE if email does not exists  
 */
function get_user_id_by_email($email) {

   $query = sprintf("SELECT `id` FROM `ptb_registrations` WHERE `email` = '$email' LIMIT 1", mysql_real_escape_string($email));

   $result = ub_query($query);

   if ( $result ){
      return fetch($result);
   } else {
      return false;
   }

}

等等。这里的概念是将每个脚本的职责分开,然后使用您需要的“部分”。

回到原来的问题

您想在表格中插入一个值吗?然后首先验证这个值。问题是你不这样做。仅此而已。

【讨论】:

    【解决方案2】:

    page2.php 中,您需要设置session,如下所示。

    因为$first_name, etc.. 没有声明。

    page2.php

    $_SESSION['first_name'] = $_POST['first_name'];
    $_SESSION['last_name'] = $_POST['last_name'];
    $_SESSION['email'] = $_POST['email'];

    page3.php

    $_SESSION['dat_of_birth'] = $_POST['date_of_birth'];
    $_SESSION['number'] = $_POST['number'];

    page4.php

    $_SESSION['display_name'] = $_POST['display_name'];
    $_SESSION['password'] = $_POST['password'];

    在 page4.php 中再做一个变量声明。

    $first_name = $_SESSION['first_name'];
    $last_name = $_SESSION['last_name'];
    $email = $_SESSION['email']; etc...

    然后将其存储在数据库中。

    【讨论】:

    • 我需要将 $_POST 添加到第 3 页吗?或者只是第 2 页
    • 不错,第 4 页有什么要补充的吗?我已经删除了第 4 页上的 id 和 null 不知道这是否有帮助?
    • ok 做了所有这些,但仍然收到错误更新数据库错误消息:(
    • 尝试 mysql_query($query) 或死 (mysql_error());告诉我你遇到了什么错误..
    • 我收到此错误:警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 标头已发送(输出开始于 /Applications/XAMPP/xamppfiles/htdocs/ptb1/包括/mod_register/mod_member/register_p4.php:18) 在 /Applications/XAMPP/xamppfiles/htdocs/ptb1/includes/mod_register/mod_member/register_p4.php 第 19 行更新数据库时出错
    【解决方案3】:

    整个脚本都是不好的做法,但我相信您的 SQL 错误是因为您提供的 ID 为空。 ID 可能是一个整数,并且很可能是自动递增的。改为这样做:

    $query="INSERT INTO ptb_registrations (
        first_name,
        last_name,
        email,
        date_of_birth,
        contact_number,
        display_name,
        password
     )
     VALUES(
        '".$first_name."',
        '".$last_name."',
        '".$email."',
        '".$date_of_birth."',
        '".$number."',
        '".$display_name."',
        '".$password."'
     )";
    

    【讨论】:

      【解决方案4】:

      第 1 页:

      <form class="" method="post" action="register_p2.php">
      <input type="text" id="first_name" name="first_name" placeholder="First Name" />
      <input type="text" id="last_name" name="last_name" placeholder="Last Name" />
      <input type="email" id="email" name="email" placeholder="Email"  />
      <input type="submit" value="Next >"  />
      </form>
      

      这里不需要 session_start

      第2页:

      <?php
      session_start();
      // other php code here
      
      $_SESSION['first_name'] = $_POST['first_name'];
      $_SESSION['last_name'] = $_POST['last_name'];
      $_SESSION['email'] = $_POST['email'];
      ?>
      <form name="myForm" method="post" action="register_p3.php" onsubmit="return validateForm()" >
      <input type="text" id="date_of_birth" name="date_of_birth" placeholder="D.O.B 10/02/1990" />
      <input type="text" id="number" name="number" placeholder="Mobile Number" />
      <input type="text" id="confirm" name="confirm" placeholder="Are You a UK resident?"  />
      <input type="submit" value="Next >"  />
      </form>
      

      添加了 $_POST

      第 3 页:

      <?php
      session_start();
      // other php code here
      
      
      $_SESSION['dat_of_birth'] = $_POST['date_of_birth'];
      $_SESSION['number'] = $_POST['number'];
      ?>
      
      <form class="" method="post" action="register_p4.php">
      <input type="text" id="display_name" name="date_of_birth" placeholder="Display Name" />
      <input type="password" id="password" name="password" placeholder="Password" />
      <input type="password" id="password2" name="password2" placeholder="Password (Confirm)"  />
      <input type="submit" value="Next >"  />
      </form>
      

      添加了 $_POST $_SESSION['first_name'] = $_POST['first_name'];

      无需在 page3 中再次添加此部分:

      $_SESSION['first_name'] = $first_name;
      $_SESSION['last_name'] = $last_name;
      $_SESSION['email'] = $email;
      

      第 4 页:

      <?php
      session_start();
      // other php code here
      
      $first_name = $_SESSION['first_name'];
      $last_name  = $_SESSION['last_name'];
      $email      = $_SESSION['email'];
      $date_of_birth = $_SESSION['dat_of_birth'] ;
      $number    =$_SESSION['number'];
      $display_name = $_SESSION['display_name'];
      $password  = $_SESSION['password'];
      ?>
      
      <?php
      ////// SEND TO DATABASE
      
      
      /////////////////////////////////////////////////////////
      
      // Database Constants
      define("DB_SERVER", "localhost");
      define("DB_USER", "root");
      define("DB_PASS", "");
      define("DB_NAME", "database");
      
      // 1. Create a database connection
      $connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
      if (!$connection) {
          die("Database connection failed: " . mysql_error());
      }
      
      // 2. Select a database to use
      $db_select = mysql_select_db(DB_NAME,$connection);
      if (!$db_select) {
          die("Database selection failed: " . mysql_error());
      }
      //////////////////////////////////////////////////////////////
      $query="INSERT INTO ptb_registrations (ID,
      first_name,
      last_name,
      email,
      date_of_birth,
      contact_number,
      display_name,
      password
       )
      VALUES('NULL',
      '".mysql_real_escape_string($first_name)."',
      '".mysql_real_escape_string($last_name)."',
      '".mysql_real_escape_string($email)."',
      '".mysql_real_escape_string($date_of_birth)."',
      '".mysql_real_escape_string($number)."',
      '".mysql_real_escape_string($display_name)."',
      '".mysql_real_escape_string($password)."'
      )";
      mysql_query($query) or die ('Error updating database');
      ?>
      <?php
      function confirm_query($result_set) {
                      if (!$result_set) {
                          die("Database query failed: " . mysql_error());
                      }
              }
      function get_user_id() {
          global $connection;
          global $email;
          $query = "SELECT *
                      FROM ptb_registrations
                      WHERE email = \"$email\"
                      ";
              $user_id_set = mysql_query($query, $connection);
              confirm_query($user_id_set);
              return $user_id_set;
              }
      ?>
      <?php
      $user_id_set = get_user_id();
      while ($user_id = mysql_fetch_array($user_id_set)) {
          $cookie1 = "{$user_id["id"]}";
          setcookie("ptb_registrations", $cookie1, time()+3600);  /* expire in 1 hour */
      
      }
      ?>
      
      <?php include ('includes/send_email/reg_email.php'); ?>
      
      <? ob_flush(); ?>
      

      将会话分配给变量:

      $first_name = $_SESSION['first_name'];
      

      mysql_* 函数已弃用,使用 mysqli_* 或 PDO

      你的代码容易受到 mysql_injection 的影响:至少使用mysql_real_escape_string

      【讨论】:

      • 我做了你所说的一切,但仍然没有将它放入我的 mysql 表中,但我没有收到任何错误,它只是表示感谢注册并且没有插入值:(
      • echo $query; 在第 4 页的 mysql_query($query) or die ('Error updating database'); 之前添加这一行,看看您的查询是如何进行的。请在此处粘贴。
      • INSERT INTO ptb_registrations(ID、first_name、last_name、email、display_name、date_of_birth、contact_number、password、account_type)VALUES('NULL', '', '', '', 'asdasd', ' ', '', 'adad', 'Member' )更新数据库时出错
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多