我是数据库领域的新手。在我的注册过程中,用户必须提供所需的值(电子邮件和密码)。现在,当已经注册并登录后,我想让用户有机会将不需要的信息添加到他在我数据库中的行中。
编辑 2:
这是我的代码相关部分的更新版本。这显然是行不通的,如果你能再次指出我正确的方向,我会非常高兴!谢谢!!
<?php
require_once 'config.php';
require_once 'database_connection.php';
$first_name = trim($_REQUEST['first_name']);
$last_name = trim($_REQUEST['last_name']);
$URL= trim($_REQUEST['URL']);
//Get the logged in user's ID
$user_id = $_REQUEST['user_id'];
//Select the logged in user
$select_query = "SELECT * FROM users WHERE user_id = " . $user_id;
//Update the user's row
$update_sql = sprintf("UPDATE users (first_name, last_name, URL) " .
"VALUES ('%s', '%s','%s');",
mysql_real_escape_string($first_name),
mysql_real_escape_string($last_name),
mysql_real_escape_string($URL));
//Parameterized queries
$stmt = $dbh->prepare("UPDATE `users` SET (first_name, last_name, URL) VALUES (:first_name, :last_name, :URL) WHERE (user_id = :user_id)");
$stmt->bindParam(':first_name', $first_name);
$stmt->bindParam(':last_name', $last_name);
$stmt->bindParam(':URL', $URL);
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
mysql_query($select_query, $update_sql, $stmt)
or die(mysql_error());
header("Location: show_user.php?user_id=" . mysql_insert_id()); //where to redirect
exit();
?>
应该执行上述代码但不执行的表单:
<body>
<!-- start register -->
<div id="register">
<form name="completeProfileForm" action="/php/complete_user.php" method="POST" enctype="multipart/form-data">
<h2>Complete your information:</h2>
<!-- first name -->
<label>First Name</label>
<input name="first_name" id="first_name" type="name" placeholder="Enter your first name" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your firstname'" />
<!-- last name -->
<label>Last Name</label>
<input name="last_name" id="last_name" type="name" placeholder="Enter your last name" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your last name'" />
<!-- website-->
<label>Website</label>
<input name="URL" id="URL" type="text" placeholder="Enter your website domain" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your website domain'" />
<!-- register button -->
<input type="submit" id="submitButton" class="button" value="Complete my profile" />
</form>
</div> <!-- end register -->
</body>
最后但并非最不重要的错误信息:
注意:第10行C:\xampp\htdocs\php\complete_user.php中未定义索引:user_id
注意:C:\xampp\htdocs\php\complete_user.php第20行 undefined variable :dbh
fatal error :在第 20 行调用 C:\xampp\htdocs\php\complete_user.php 中非对象的成员函数 prepare()
非常感谢您的所有宝贵意见!
最佳答案
据我所知,如果您正确地将文本和变量链接在一起,您的 Updatescript 应该可以工作。
PHP
中的串联使用点 '.'
。
所以你的SQL语句一定是这样的
$update_sql = ("UPDATE `users` SET `first_name` = ".$first_name.", `last_name` = ".$last_name.", `user_type` = ".$user_type.", `URL` = ".$URL." WHERE `user_id` = ".$user_id);
但是您不应该只在查询中使用用户的输入。查看更多关于 SQL Injection here! 的信息
您必须转义用户输入!
你可以用某些函数来做到这一点,这是其中的两个:
$user = $mysqli->real_escape_string($user);
$user = htmlentities($user);
您还应该使用参数化查询。这是一个带有更新查询第一个参数的简单示例,只需在转义后以相同模式添加其余代码即可!:
$stmt = $dbh->prepare("UPDATE `users` SET (firstname) VALUES (:firstname) WHERE (userid = :userid)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':userid', $userid);
$stmt->execute();
此外,您正在使用 mysql_insert_id()
,它 检索由上一个查询(通常是 INSERT)为 AUTO_INCREMENT 列生成的 ID。
更多关于 official documentation 中的信息。
但如果您在您的情况下INSERTING一个新用户,但您更新现有用户,则 MySQL 只会生成一个 ID。因此不会返回任何 ID。您需要在 UPDATE 之后使用 SELECT 从用户那里手动获取 ID,然后将此 ID 添加到您的重定向。
EDIT2
你可以,而且应该为了节省流量,把你的
$stmt = $dbh->prepare("UPDATE `users` SET (first_name) VALUES (:first_name) WHERE (user_id = :user_id)");
$stmt->bindParam(':first_name', $first_name);
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
$stmt = $dbh->prepare("UPDATE `users` SET (last_name) VALUES (:last_name) WHERE (user_id = :user_id)");
$stmt->bindParam(':last_name', $last_name);
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
$stmt = $dbh->prepare("UPDATE `users` SET (URL) VALUES (:URL) WHERE (user_id = :user_id)");
$stmt->bindParam(':URL', $URL);
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
在一条语句中
$stmt = $dbh->prepare("UPDATE `users` SET (first_name, last_name, URL) VALUES (:first_name, :last_name, :URL) WHERE (user_id = :user_id)");
$stmt->bindParam(':first_name', $first_name);
$stmt->bindParam(':last_name', $last_name);
$stmt->bindParam(':URL', $URL);
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
我正在查看您的错误消息并告诉您它们的含义,我认为这应该足以让您修复它们
Notice: Undefined index: user_id in C:\xampp\htdocs\php\complete_user.php on line 10
这意味着您的$_Request['user_id'] 没有找到 key
user_id`。查看您的 HTML,这有点复杂。您需要在他登录时将 user_id 保存在 Session 中,然后使用 $_SESSION['user_id'] 访问它。在这里写这个会太宽泛,但这就是你所需要的。您现在正在做的是从表单中获取 UserId,但是表单从不使用 userId,并且表单也从不将 userId 发送到 PHP 文件。
Notice: Undefined variable: dbh in C:\xampp\htdocs\php\complete_user.php on line 20
$dbh
仅来自示例。您从未初始化此变量。您需要使用 MySQLi
类中的您自己的实例。这应该在处理数据库连接的 php 文件中完成。所以我猜你已经有了这个实例,你只是调用了错误的变量。
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\php\complete_user.php on line 20
由于 $dbh
不是来自 MySQLi
的实例,您显然不能从 MySQLi 调用
因为 PHP 没有任何线索。所以你需要使用你自己的 prepare()
函数MySQLi
实例,最好来自你的 database.php
。
提示:当您使用 MySQL
时也是如此,但是您应该将其更改为 MySQLi
因为 MySQL
已被弃用并将在 PHP 5.5 版本中删除。
关于php - 如何向已注册用户添加用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993542/