PHP检查输入中的错误,如果没有错误,则执行并上载
我目前正在开发一个注册系统,遇到了一些问题。PHP检查输入中的错误,如果没有错误,则执行并上载,php,upload,Php,Upload,我目前正在开发一个注册系统,遇到了一些问题。 我将首先粘贴代码的简化版本,然后: session_start(); if (isset($_SESSION['logged_in'])) { header('Location: #notLoggedIn'); exit; } else { if ($_SERVER["REQUEST_METHOD"] == "POST") { if //if field is empty { //display erro
我将首先粘贴代码的简化版本,然后:
session_start();
if (isset($_SESSION['logged_in'])) {
header('Location: #notLoggedIn');
exit;
} else {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if //if field is empty {
//display error
} else if //check if any unallowed characters {
//display another error
} else {
//give the checked input a string/variable, ex: $name= ($_POST["name"]);
}
// Like 4-5 other checks running in the same way as above
}
$query = $pdo->prepare('INSERT INTO table (a, b, c, d, e) VALUES (?,?,?,?,?)');
$query->bindValue(1, $1);
$query->bindValue(2, $2);
$query->bindValue(3, $3);
$query->bindValue(4, $4);
$query->bindValue(5, $5);
$query->execute();
header('Location: index.php');
exit;
}
问题是它一次运行所有内容,只是将我重定向到index.php。如何确保在运行前首先检查表单是否已提交。
之后,我希望它检查所有字段中的任何错误。如果有错误,请停止。
但如果没有错误,请继续并上传到我的数据库 我确实认为我走的很好,但是现在我被卡住了,在正确的方向上任何帮助或推动都会很棒
谢谢大家!
// error = 0 means no error found you can continue to upload...
if ($_FILES['file']['error'] == 0) {
}
以下是解释的所有错误:
UPLOAD\u ERR\u OK
值:0;没有错误,文件上载成功
UPLOAD\u ERR\u INI\u SIZE
值:1;上载的文件超出了允许的范围
php.ini中的upload\u max\u filesize指令
UPLOAD\u ERR\u FORM\u SIZE
Value:2;上载的文件超出了允许的范围
HTML表单中指定的MAX\u FILE\u SIZE
指令
UPLOAD\u ERR\u PARTIAL
值:3;上载的文件仅部分上载
UPLOAD\u ERR\u NO\u文件
Value:4;没有上载任何文件
UPLOAD\u ERR\u NO\u TMP\u DIR
Value:6;缺少一个临时文件夹。在PHP5.0.3中引入
UPLOAD\u ERR\u CANT\u WRITE
Value:7;无法将文件写入磁盘。在PHP5.1.0中引入
上传错误扩展名
值:8;PHP扩展停止了该文件
上传。PHP没有提供一种方法来确定是哪个扩展导致了错误
文件上传停止;使用检查已加载扩展的列表
phpinfo()可能会有所帮助。在PHP5.2.0中引入
验证输入字段的步骤
if(empty($_POST['name'])&&empty($_POST['password'])){
//fields empty show error here
}else if (is_numeric($username[0])){
echo 'First character must be a letter';
}
else if (!preg_match('/^[a-zA-Z0-9]+$/', $username)) {
echo 'Only letters and numbers are allowed';
}else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo 'Invalid email address.';
}else if(!preg_match("/^[\pL\s,.'-]+$/u", $name)) {
echo 'Invalid name.';
}
您的问题不清楚,您的代码也不完整(表单在哪里?。
您似乎正处于学习表单处理的早期阶段,在提出具体问题之前,您可能会从进一步的阅读和测试中受益 以下是一些初学者:
无论如何,我会给你一些信息,因为我有一些空闲时间 例如,第一个
if
检查会话是否已设置,如果为TRUE,则重定向到notLoggedIn。你确定这是故意的吗?他们要么登录,根据需要回显消息,要么不显示注册页面(大多数站点在同一页面上显示登录和注册,以方便所有场景)
由于这是一份注册表,您的意思肯定是如果已登录,则重定向到YouAreAlreadyLoggedIn?事实上,我只需退出一条消息“您已经登录”,然后停止脚本 问题是它一次运行所有东西,只是将我重定向到index.php 这是因为它没有其他选项,因为在XYZ之后的脚本末尾,它重定向到index.php。
如果您不希望它这样做,请更改它。要么不重定向,更具建设性地处理整个过程,要么在需要时退出(如表单错误) 如何确保在运行之前首先检查表单是否已提交 我没有看到表格,所以不知道你到底在做什么来提供建议 理想情况下,您应该使用PRG(后重定向Get)。
你的剧本 我已经编辑了你的脚本,使其成为问题的答案,并对其进行了整理 e、 g.在脚本中,特别是在顶部,您不需要
else
,因为if
中有一个exit()
。当if
返回true时,脚本将停止,否则(有或没有else
)脚本将继续
守则:
session_start();
if (isset($_SESSION['logged_in']))
{
exit('You are already logged in');
}
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if ( strlen($POST['field_name']) < 4 )
{
exit('Minimum 4 chars required');
}
elseif ( strlen($POST['field_name']) > 20 )
{
exit('Max of 20 chars allowed');
}
elseif ( preg_match("/^[A-z0-9]+$/", $POST['field_name']) != 1 )
{
exit('Invalid chars - allowed A-z and 0-9 only');
}
else
{
// Not sure what you want here
// If all ok (no errors above)
// then sanatise the data and insert into DB
}
}
session_start();
如果(isset($_会话['logged_in']))
{
退出(“您已登录”);
}
如果($\服务器[“请求\方法”]=“发布”)
{
如果(strlen($POST['field_name'])<4)
{
出口(至少需要4个字符);
}
elseif(strlen($POST['field_name'])>20)
{
出口(最多允许20个字符);
}
elseif(preg_match(“/^[A-z0-9]+$/”,$POST['field_name'])!=1)
{
退出(“无效字符-仅允许A-z和0-9”);
}
其他的
{
//不知道你想要什么
//如果全部正常(以上无错误)
//然后对数据进行SANATIZE并插入数据库
}
}
至于进入数据库,在允许数据库运行之前,需要对整个过程进行更多的检查和处理
不确定为什么重定向到index.php。然后,您需要在index.php中处理表单提交结果,以告知用户您已注册。
在表单页面上,告诉他们字段中的错误,或者回显成功消息以及接下来会发生什么(即转到您的帐户页面,或者(希望)在登录之前确认您发送的电子邮件)
至于发布表单数据中的验证检查,完全取决于您需要什么。但我给了你一些基本的东西。确保表单中设置的最大值与数据库列容差相匹配,或者如果(例如)DB varchar设置为15,并且允许用户输入20,则他们输入的数据将被截断,他们将注册,但永远无法登录(或者其他一些数据将被破坏,他们的名称/用户名等)。感到厌烦。这不适用于互联网积分
<?php
// create table user (userid int auto_increment primary key, username varchar(60), password varchar(60));
// alter table user add constraint uc_user_username unique (username);
var_dump($_POST);
$user = isset($_POST['username']) ? trim($_POST['username']) : '';
$pass = isset($_POST['password']) ? trim($_POST['password']) : '';
$pass2 = isset($_POST['confirm']) ? trim($_POST['password2']) : '';
$action = isset($_POST['action_type']) ? $_POST['action_type'] : '';
if (empty($_POST)) {
// nothing posted
}
else {
if (empty($user)) {
error('you did not provide a username');
}
elseif (empty($pass)) {
error('you did not provide a password');
}
else {
$mysqli = mysqli_connect('localhost','root','','test')
or die('Error ' . mysqli_error($link));
if ($action=='new_user') {
$userdata = get_user_info($mysqli,$user);
if ($userdata) {
error('user already exists');
}
else {
$validpass = validate_password($pass);
if ($validpass && $pass==$pass2){
if (make_new_user($mysqli,$user,$pass)) {
print "<br/>new user created<br/><br/>";
}
}
else error('passwords did not match');
}
}
elseif ($action=='login_user') {
$verified = verify_credentials($mysqli,$user,$pass);
if ($verified) {
print "<br/>user logged in<br/><br/>";
}
}
elseif ($action=='update_pass') {
$verified = verify_credentials($mysqli,$user,$pass);
$validpass = validate_password($pass);
if ($verified && $validpass && $pass!=$pass2) {
if (update_password($mysqli,$user,$pass,$pass2)) {
print "<br/>new user created<br/><br/>";
}
}
else error('cannot update to same password');
}
$mysqli->close();
}
}
function error($message) {
print "<br/>$message<br/><br/>";
}
function update_password($mysqli,$user,$pass,$pass2) {
$hash = password_hash($pass, PASSWORD_BCRYPT);
$stmt = $mysqli->prepare('update user set password = ? where username = ?');
$stmt->bind_param('ss',$user,$hash);
$stmt->execute();
$msql_error = $mysqli->error;
$updated = !(empty($msql_error));
error($msql_error); // for debugging only
return $updated;
}
function make_new_user($mysqli,$user,$pass) {
$userid = false;
$hash = password_hash($pass, PASSWORD_BCRYPT);
$stmt = $mysqli->prepare('insert into user (username,password) values (?,?)');
$stmt->bind_param('ss',$user,$hash);
$stmt->execute();
$msql_error = $mysqli->error;
if (empty($msql_error)) {
$userid = $mysqli->insert_id;
}
else error($msql_error); // for debugging only
return $userid;
}
// really, this should be done with javascript instantaneously
function validate_password($pass) {
$error = false;
if (strlen($pass) < 8) {
error('please enter a password with at least 8 characters');
}
elseif (!preg_match('`[A-Z]`', $pass)) {
error('please enter at least 1 capital letter');
}
else $error = true;
return $error;
}
function verify_credentials($mysqli,$user,$pass) {
$row = get_user_info($mysqli,$user);
$verified = false;
if ($row) {
if (password_verify($pass, $row['pass'])) {
$verified = true;
}
}
else error('username and password did not match');
return $verified;
}
function get_user_info($mysqli,$user) {
$row = array();
$stmt = $mysqli->prepare('select userid, username, password
from user
where username = ?');
$stmt->bind_param('s',$user);
$stmt->execute();
$stmt->bind_result($row['userid'],$row['user'],$row['pass']);
if (!$stmt->fetch()) $row = false;
$stmt->close();
return $row;
}
?>
<body>
<form action='?' method='post'>
<table id='input_table'>
<tr><td><span>username </span></td><td><input id='username' name='username' type='text' value='<?php echo $user ?>'></td></tr>
<tr><td><span>password </span></td><td><input id='password' name='password' type='text' value='<?php echo $pass ?>'></td></tr>
<tr><td><span>password2</span></td><td><input id='password2' name='password2' type='text' value='<?php echo $pass2 ?>'></td></tr>
<tr><td> </td><td> </td></tr>
<tr><td colspan=2>this just picks the action for testing... you wouldn't keep it around</td></tr>
<tr><td><input type='radio' name='action_type' value='new_user' <?php echo $action=='new_user'?'checked':'' ?>>New User</td></tr>
<tr><td><input type='radio' name='action_type' value='login_user' <?php echo $action=='login_user'?'checked':'' ?>>Logging In</td></tr>
<tr><td><input type='radio' name='action_type' value='update_pass' <?php echo $action=='update_pass'?'checked':'' ?>>New Password</td></tr>
<tr><td> </td><td> </td></tr>
<tr><td colspan=2><input id='submit' name='submit' type='submit'/></td></tr>
</form>
</body>
用户名它取决于错误检查条件中的内容。至少您应该确保在出现错误时不执行dabase插入和重定向。@jeroen I稍微更新了上面的“检查”。但这也取决于它是什么输入字段,例如,如果它是用户名,它首先确保它不是空的,然后检查是否有任何不允许的字符。但如果它只是一个普通的名字,不需要注册,它只需要检查un