php - 如何向已注册用户添加用户数据

标签 php mysql

我是数据库领域的新手。在我的注册过程中,用户必须提供所需的值(电子邮件和密码)。现在,当已经注册并登录后,我想让用户有机会将不需要的信息添加到他在我数据库中的行中。

编辑 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 调用 prepare() 函数 因为 PHP 没有任何线索。所以你需要使用你自己的 MySQLi 实例,最好来自你的 database.php

提示:当您使用 MySQL 时也是如此,但是您应该将其更改为 MySQLi 因为 MySQL 已被弃用并将在 PHP 5.5 版本中删除。

关于php - 如何向已注册用户添加用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993542/

相关文章:

php - PHP+MySQL 中的 IP 黑名单

php - 如何从下拉列表中捕获数据以在 SQL 查询中使用它?

php - SQL : keep count in row or select count from db

php - 通过 yum 安装 php,包括 mysql 支持

php - 动态类扩展

php - Laravel Nova 索引按钮没有出现

php - 与数据库连接时出现奇怪的错误

php - 如何根据查询的结果执行/返回查询的一部分(使用 Eloquent 或原始 SQL)?

php - 尝试使用 PHP 创建注册表单

php - 如何使用复选框使用 HTML、CSS 正确处理 PHP 表单(URL)?