我有一个调查网页,如果用户完成,我会发送他们提供的数据(从其他页面$_SESSION
),我会将他/她的状态更改为0(他们不能这样做)之后使用他/她的登录信息进行调查。)。
所有这些都与PDO
有关。但为什么页面总是重定向到一个白色的空白页?
这是我的代码
<?php
session_start();
if (!isset($_SESSION['user']))
{
header("location:index.php");
}
?>
<?php
require_once "condb.php";
?>
<?php
if (isset($_POST['BTN_P2']))
{
$_SESSION['problem'] = $_POST['problem'];
if ($_SESSION['problem'] == "yes"){header("location:survey_3.php");}
else
{
$sql="INSERT INTO data(time,suggest,phone,eat,problem) VALUES(?,?,?,?,?)";
$stm=$cn->prepare($sql);
$stm->bindParam("1",$_SESSION['time']);
$stm->bindParam("2",$_SESSION['suggest']);
$stm->bindParam("3",$_SESSION['phone']);
$stm->bindParam("4",$_SESSION['eat']);
$stm->bindParam("5",$_SESSION['problem']);
try
{
$stm->execute();
try
{
$sqlstatus="INSERT INTO login(status) VALUES(0)";
$stmt=$cn->prepare($sqlstatus);
$stmt->execute();
echo "Finish!";
header('location:finish.php');
}
catch (Exception $error)
{
echo $error->getTraceAsString();
}
}
catch (Exception $e)
{
echo $e->getTraceAsString();
}
}
}
?>
我缺少什么?
编辑#1:验证$_SESSION['user']
的来源。
<?php
if (isset($_POST['BTN_ENTER']))
{
$username=$_POST['username'];
$password=$_POST['password'];
$hashed_password=password_hash($password,PASSWORD_DEFAULT);
try
{
$stmt = $cn->prepare("SELECT * FROM login WHERE username=:username LIMIT 1");
$stmt->execute(array(':username'=>$username));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount() > 0)
{
if(password_verify($password, $result['password']))
{
if ($result['status']==1)
{
$_SESSION['user']=$result['name'];
header('location:survey.php');
}
}
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
答案 0 :(得分:0)
您应该尝试将脚本分解为函数/方法,以便于使用,读取,重用等。当您创建函数时,您可以在实现之前手动尝试它。一旦你确认该函数本身有效,那么你将它抛入逻辑中,如果某些东西失败,你知道它不是那个函数:
<强> /functions/suggestEatingProblem.php 强>
<?php
function suggestEatingProblem($con,$array)
{
$sql = "INSERT INTO `data` (`time`,`suggest`,`phone`,`eat`,`problem`) VALUES(?,?,?,?,?)";
$query = $con->prepare($sql);
# Since you are not really doing anything special with your parameters
# just do the array into the execute function, it's more straight forward
$query->execute($array);
}
<强> /functions/addLoginStatus.php 强>
<?php
function addLoginStatus($con,$val)
{
# Don't need to prepare, just query
$con->query("INSERT INTO login (`status`) VALUES({$val})");
}
<强> /functions/verifyUser.php 强>
<?php
function verifyUser($con,$username,$password)
{
$stmt = $con->prepare("SELECT `password`,`name` FROM login WHERE username = ? LIMIT 1");
$stmt->execute(array($username));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if(empty($result['password']))
return false;
$isValid = password_verify($password, $result['password']);
return ($isValid)? $result['name'] : false;
}
<强> /config.php 强>
<?php
# Create some helpful constants
define('DS',DIRECTORY_SEPARATOR);
define('ROOT_DIR',__DIR__);
define('FUNCTIONS',ROOT_DIR.DS.'functions');
# Start session
session_start();
# Start database
require_once(ROOT_DIR.DS."condb.php");
<强> /whatever.php 强>
<?php
# Add config at top
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');
# Add our functions to be used
require_once(FUNCTIONS.DS.'suggestEatingProblem.php');
require_once(FUNCTIONS.DS.'addLoginStatus.php');
# If no session, redirect
if (!isset($_SESSION['user'])) {
header("Location: index.php");
# Make sure to stop your script if you are done with the page
exit;
}
# Check if submission
if(isset($_POST['BTN_P2'])) {
# Assign problem (trim it)
$_SESSION['problem'] = trim($_POST['problem']);
# If yes
if($_SESSION['problem'] == "yes") {
# Redirect and stop the script execution
header("Location: survey_3.php");
exit;
}
else {
# Just do one "try" here...
try {
# Run your function here
suggestEatingProblem($cn,array(
$_SESSION['time'],
$_SESSION['suggest'],
$_SESSION['phone'],
$_SESSION['eat'],
$_SESSION['problem']
));
# Run your second function here
addLoginStatus($cn,'0');
# Redirect. You can not put content before you redirect, so
# remove the "Finished" echo
header('Location: finish.php');
exit;
}
catch (PDOException $e){
echo 'Error occurred: '.$e->getTraceAsString();
}
}
}
else {
echo 'No request sent.';
}
验证部分:
# Add function (see the other example to add the config)
require_once(FUNCTIONS.DS.'verifyUser.php');
# If there is a submission
if(isset($_POST['BTN_ENTER'])) {
try {
# Fetch the name (or false)
$user = verifyUser($cn,trim($_POST['username']),trim($_POST['password']));
# If not false
if($user) {
# Assign the value
$_SESSION['user'] = $user;
# Redirect and stop execution of script
header('Location: survey.php');
exit;
}
}
catch(PDOException $d) {
echo $e->getMessage();
}
}