我是数据库世界的新手。在我的注册过程中,用户必须提供所需的值(电子邮件和密码)。现在,当已经注册并登录时,我想让用户有机会将不需要的信息添加到我的数据库中的行中。
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()
非常感谢你们所有的好意见!
答案 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版本。