如何将用户数据添加到已注册的用户

时间:2014-06-02 11:34:07

标签: php mysql

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

EDIT2:

以下是我的代码相关部分的更新版本。它显然不起作用,如果你能再次指出我正确的方向,我会非常高兴!谢谢!!

<?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

注意:未定义的变量:第20行的C:\ xampp \ htdocs \ php \ complete_user.php中的dbh

致命错误:在第20行的C:\ xampp \ htdocs \ php \ complete_user.php中的非对象上调用成员函数prepare()

非常感谢你们所有的好意见!

1 个答案:

答案 0 :(得分:0)

如果你正确地将文本和变量链接在一起,你的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);

此外,您还要使用参数化查询。这是一个使用Update Query的第一个参数的简单示例,只需在转义后以相同的模式添加其余代码!:

$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()使用Retrieves the ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT). $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(); 更多有关official documentation的信息。

但是,如果您在案例中插入新用户,但是您更新现有用户,则MySQL只会生成ID。因此不会返回任何ID。您需要在更新后使用 SELECT 手动从用户处获取ID,然后将此ID添加到重定向。

<强> EDIT2

你可以,而且应该节省流量,把你的

$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'] doesn't find a key

这意味着您的Notice: Undefined variable: dbh in C:\xampp\htdocs\php\complete_user.php on line 20 user_id`。看着你的HTML,这有点复杂。您需要在登录时将{user} ID保存在Session,然后使用$ _SESSION [&#39; user_id&#39;]进行访问。在这里写这个是广泛的,但这就是你需要的。你现在正在做的是要求Form中的UserId,但Form永远不会与userId一起使用,表单也永远不会将userId发送到PHP文件。

$dbh

MySQLi就是这个例子。你从来没有初始化这个变量。您需要使用Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\php\complete_user.php on line 20 类中的自己的实例。这应该在处理数据库连接的php文件中完成。所以我猜你已经有了这个实例,你只是调用了错误的变量。

$dbh

由于MySQLi不是来自prepare()的实例,您显然无法从MySQLi调用MySQLi函数,因为PHP没有提供任何线索。因此,您需要使用自己的database.php实例,最好是使用MySQL

提示:与MySQLi一样,您正在使用它,但是您应该将其更改为MySQL,因为{{1}}已弃用,将在5.5中删除PHP版本。