2

誰か助けてください。3 ページ以上のフォームを送信しようとしています。それぞれに 3 つのテキスト領域フィールドがあり、セッション開始を使用して他のページのフォーム データをエコーし​​ます。

最後に、フォーム データをエコーアウトして、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(); ?>
4

4 に答える 4

2

誰かが私を助けて、どこが間違っているのか教えてください。

あなたのコード自体はひどいものです。理由

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."'

$_SESSION7)およびで何も検証しません$_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;
   }

}

等々。ここでのコンセプトは、スクリプトごとに責任を分離し、必要な「部分」を使用することです。

元の質問に戻る

テーブルに値を挿入しますか? 次に、最初にこの値を検証します。問題は、あなたがそれをしないことです。これ以上何もない。

于 2013-02-14T06:54:14.553 に答える
0

ページ 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 に対して脆弱です: atleast を使用してくださいmysql_real_escape_string

于 2013-02-14T06:13:20.207 に答える
0

以下のように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 で、もう 1 つ変数宣言を行います。

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

次に、データベースに保存します。

于 2013-02-14T06:00:58.600 に答える
0

このスクリプト全体は悪い習慣ですが、IDをnullとして提供しているため、SQLエラーが発生すると思います。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."'
 )";
于 2013-02-14T06:04:42.063 に答える