我试图创建一个用户可以更新其个人资料详细信息的表单,但它似乎无法正常工作。
我是服务器端编程的初学者,因此我将来自不同教程的代码拼凑在一起即可。来自http://www.codingcage.com/2015/04/php-login-and-registration-script-with.html
class.user.php 文件,最初只有登录和注册代码。我复制了注册函数并更改了一些内容而不是更新:
public function update($id,$uname,$umob,$uaddr,$uacc,$upass) {
try {
$upass = password_hash($upass, PASSWORD_DEFAULT);
$stmt = $this->conn->prepare(
"UPDATE users
SET
id = :id,
name = :uname,
mobile = :umob,
address = :uaddr,
accNo = :uacc,
password = :upass
WHERE id = :id"
);
$stmt->bindParam(":id", $id);
$stmt->bindParam(":upass", $upass);
$stmt->bindParam(":uacc", $uacc);
$stmt->bindParam(":uname", $uname);
$stmt->bindParam(":uaddr", $uaddr);
$stmt->bindParam(":umob", $umob);
$stmt->execute();
return $stmt;
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
和 view_account.php :(编辑3,整个文件包括@e_i_pi的代码更正):
<?php
ini_set("error_log", "/path/to/error.log");
require_once("session.php");
require_once("class.user.php");
$auth_user = new USER();
$stmt = $auth_user->runQuery("SELECT * FROM users WHERE consumer-no=:cno");
$userRow = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$session->is_loggedin()){
// session no set redirects to login page
$session->redirect('index.php');
}
if(isset($_POST['submit']) && $_POST['submit'] === 'save') {
$uname = strip_tags($_POST['full-name']);
$umob = strip_tags($_POST['mobile']);
$uaddr = strip_tags($_POST['addr']);
$uacc = strip_tags($_POST['bank-acc']);
$id = strip_tags($_POST['id']);
$upass = strip_tags($_POST['password']);
if($uname=="") {
$signuperror[] = "Please Enter Your Full Name!";
}
else if($umob=="") {
$signuperror[] = "Please Enter Your Mobile No.!";
}
else if($uaddr=="") {
$signuperror[] = 'Please Enter Your Address!';
}
else if($upass=="") {
$signuperror[] = "Please Enter a Password!";
}
else if(strlen($upass) < 6) {
$signuperror[] = "Password must be atleast 6 characters";
}
else {
try {
// I commented out these for some weird reason I can't even rememebr
// $stmt = $auth_user->runQuery("SELECT id FROM users WHERE id=:id");
// $stmt->execute(array(':id'=>$id));
// $row = $stmt->fetch(PDO::FETCH_ASSOC);
$auth_user->update($id,$uname,$umob,$uaddr,$uacc,$upass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Gas Booking</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>gas booking</h1>
<nav>
<ul>
<li><a href="index.php">home</a></li>
<li><a href="booking.php">booking</a></li>
<li><a href="payment.php">payment</a></li>
<li><a href="ticket.php">ticket</a></li>
<li><a href="view_account.php">view account</a></li>
<li><a href="user-bank.php">bank</a></li>
<li><a href="logout.php?logout=true">logout</a></li>
</ul>
</nav>
</header>
<div class="content">
<h2>Edit Your Profile Details</h2>
<form method="post" action="view_account.php">
<input type="hidden" id="id" name="id" value="<?php echo $_SESSION['id']; ?>">
<label for="full-name" class="input-info">
<div class="label">full name</div>
<input type="text" id="full-name" name="full-name" value="<?php echo $_SESSION['name']; ?>">
</label>
<label for="mobile" class="input-info">
<div class="label">mobile number</div>
<input type="text" id="mobile" name="mobile" value="<?php echo $_SESSION['mob']; ?>">
</label>
<label for="addr" class="input-info">
<div class="label">address</div>
<input id="addr" name="addr" value="<?php echo $_SESSION['addr']; ?>">
</label>
<label for="bank-acc" class="input-info">
<div class="label">bank account number</div>
<input type="text" id="bank-acc" name="bank-acc" value="<?php echo $_SESSION['accNo']; ?>">
</label>
<hr>
<label for="password" class="input-info">
<div class="label">password</div>
<input type="password" id="password" name="password">
</label>
<button type="submit" name="submit" value="save">
Save Changes
</button>
</form>
</div>
</body>
</html>
我的表格如下:
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`consumerNo` varchar(15) NOT NULL,
`password` varchar(255) NOT NULL,
`accNo` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL,
`mobile` bigint(10) NOT NULL,
`balance` bigint(10) NOT NULL,
`joining_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
我确定我做了些蠢事。我真的很感激我指向正确的方向,我一直坐到凌晨5点,我对自己感到沮丧。
与db的连接正常,类正确包含在内。如果您需要更多信息,请与我们联系。谢谢!
可以在此处下载项目:https://www.dropbox.com/s/9v69m18l82n1t46/gas.zip?dl=0。警告代码混乱。
答案 0 :(得分:9)
您似乎在view-account.php
中执行了以下操作:
try {
$auth_user->update($id,$uname,$umob,$uaddr,$uacc,$upass);
} catch(PDOException $e) {
echo $e->getMessage();
}
然而,您已经try/catch
在update()
方法中了。我认为它永远不会发生这种情况,因为你的if/elseif/elseif/else/etc
检查中的错误被选中了。你可以修改它看起来像是为了测试目的:
$errors = [];
if ($uname == "") {
$errors[] = "Please Enter Your Full Name!";
}
if ($umob == "") {
$errors[] = "Please Enter Your Mobile No.!";
}
if ($uaddr == "") {
$errors[] = 'Please Enter Your Address!';
}
if ($upass == "") {
$errors[] = "Please Enter a Password!";
}
if (strlen($upass) < 6) {
$errors[] = "Password must be atleast 6 characters";
}
// check errors
if (!empty($errors)) {
print_r($errors);
return false;
}
// otherwise try the query:
$obj = $auth_user->update($id, $uname, $umob, $uaddr, $uacc, $upass);
让我们知道会发生什么!
我认为你会抛出一个错误,就像那样;
SQLSTATE [HY093]:参数号无效
这是因为你试图在:id
上绑定两次。您必须记住,用户ID
是唯一的,不应该更改(对吗?)。
将您的查询修改为如下所示:
$stmt = $this->conn->prepare(
"UPDATE users
SET
name = :uname,
mobile = :umob,
address = :uaddr,
accNo = :uacc,
password = :upass
WHERE id = :id"
);
if(PASSWORD == PASSWORD_REPEAT) { .... SET PASSWORD...
)ID
。这是不安全的。由于它已经在$_SESSION
,因此只需在 view-account.php
文件中进行访问即可!
<form...
元素,我可以轻松地将该隐藏输入修改为其他用户ID
,允许我更改其密码/信息等。action
属性...因此它什么也没做。最好将其更改为view-account.php
页面 strip_tags()
。它可能会破坏某些字段(即密码)。你也已经绑定/准备你的陈述(道具给你,好工作!)view-account.php
文件,可以对其进行修改以停止使用所有这些if / elseif / elseif / else
语句。你实际上是在检查你的所有字段,如果它失败了,你就会向一个数组添加一条错误信息,但是如果它通过你正在运行查询,这是不好的做法。你应该看一下类似于(伪代码)的东西:$errors = [];
if (!check_fields()) {
$errors[] = THE FIELD ERROR MESSAGE;
}
// now check if your errors are empty or not
if(!empty($errors)) {
// this means we have errors in the form.
// return the errors array to the front end and handle it appropriately.
return $errors;
}
// otherwise we can try the query here now!
try {
// YOUR SQL UPDATE QUERY
} .....`
答案 1 :(得分:4)
对,你有一些不匹配等问题,如果你刚开始就会有所期待。
让我们从HTML表单开始。这里有两个问题:
我建议将您的HTML表单更改为:
<form method="post" action="view-account.php">
<input type="hidden" id="id" name="id" value="<?php echo $_SESSION['id']; ?>">
<label for="full-name" class="input-info">
<div class="label">full name</div>
<input type="text" id="full-name" name="full-name" value="<?php echo $_SESSION['name']; ?>">
</label>
<label for="mobile" class="input-info">
<div class="label">mobile number</div>
<input type="text" id="mobile" name="mobile" value="<?php echo $_SESSION['mob']; ?>">
</label>
<label for="addr" class="input-info">
<div class="label">address</div>
<input id="addr" name="addr" value="<?php echo $_SESSION['addr']; ?>">
</label>
<label for="bank-acc" class="input-info">
<div class="label">bank account number</div>
<input type="text" id="bank-acc" name="bank-acc" value="<?php echo $_SESSION['accNo']; ?>">
</label>
<hr>
<label for="password" class="input-info">
<div class="label">password</div>
<input type="password" id="password" name="password">
</label>
<button type="submit" name="submit" value="save">
Save Changes
</button>
</form>
现在,一旦将此表单提交到view-account.php,我们要确保提交按钮是“保存”模式,因此我们将view-account.php的第一行更改为:
if(isset($_POST['submit']) && $_POST['submit'] === 'save') {
这种方法意味着我们可以在同一表单上使用不同的提交按钮 - 我们将来可能需要保存,删除,存档等操作。
最后,我注意到数据库表中的id
字段已声明为AUTOINCREMENT
。很好,正是你想要的,数据库id
字段是我们让数据库确定的内部唯一标识符(在99%的情况下 - 有我们喜欢定义我们自己的UID的边缘情况)。这意味着您的UPDATE
声明存在问题。您无法更新自动递增的字段。在class.user.php文件中,将$stmt
的声明更改为:
$stmt = $this->conn->prepare(
"UPDATE users
SET
name = :uname,
mobile = :umob,
address = :uaddr,
accNo = :uacc,
password = :upass
WHERE id = :id"
);
这应该可以解决您的代码问题,我想我得到了一切。 但,可能还有其他问题。如果您的代码仍然无效,我建议您检查错误日志。如果您不确定它们在哪里,请检查您的php.ini
文件以查看错误日志位置,或者通过将其放在您尝试调试的页面顶部来覆盖默认位置:< / p>
ini_set("error_log", "/path/to/error.log");