我得到了一个系统,用户必须注册并登录到我的网站添加食谱,其中非注册用户和显然注册用户可以从前端查看。到目前为止,我所做的是,我已经完成了注册页面,登录页面和"我的帐户"页面,供用户登录和提交食谱。一切工作,但现在我试图在我的系统中添加另一个功能,用户可以编辑/删除自己的食谱。我完成登录的方式是通过创建一个会话来保存用户名,而不是像这样在url中输出:www.cooking.com/my-account.php?user_id=26.
我想要同样的东西,但这次我希望食谱存储在会话中,而不是在url上显示的食谱id。我不知道如何做这件事。我在mysql中有一个'starters'表,包含以下字段:
username ()
recipename
ingredients
method
time
id
一旦你登录并想编辑/删除你上传的食谱,会显示一个表,其中包含你上传的所有食谱。我想要的是让用户点击任何食谱,它应该带用户到另一个页面,它允许用户编辑他们的东西。
我试过了,但是没有成功。以下是我使用的代码,一旦点击编辑,错误显示:
编辑起始页(editstarts .php)
<?php
session_start();
require_once '../database.php';
if (isset($_SESSION['myusername'])){
echo "Welcome ". $_SESSION['myusername'];
}
?>
<br /><br />You have uploaded the following starters:
<br /><BR />
<?php
include '../database.php';
$userid = $_SESSION["myusername"];
$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' ");
echo "<table border='1'><table border width=65%><tr><th>Recipie Name</th><th>Ingredients</th><th>Method</th><th>Time</th></tr>";
while($getrecipie = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $recipiename = $getrecipie['recipename']. "</td>";
echo "<td>" . $ingredients = $getrecipie['ingredients']. "</td>";
echo "<td>" . $method = $getrecipie['method']. "</td>";
echo "<td>" . $time = $getrecipie['time']. 'minutes'."</td>";
?>
<td><a href = "startersedited.php?rec=<?php echo $getrecipie['id'] ?>" >Edit</a></td>
<td><a href = "DELETE1.php?rec=<?php echo $getrecipie['Recipie_ID'] ?>&id=<?php echo $user_id?>" >Delete</a></td>
<!--using the stu_id value in the URL to select the correct data when wego to the relevant pages -->
<?php
}
echo "</tr>";
echo "</table>";
?>
starter编辑页(startersededit .php)
<?php
session_start();
require_once '../database.php';
if (isset($_SESSION['myusername'])){
echo "Welcome ". $_SESSION['myusername'];
}
?>
<br /><br />EDIT/DELETE YOUR STARTERS
<br /><BR />
<?php
include '../database.php';
$userid = $_SESSION["myusername"];
$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");
$getrecipie = mysql_fetch_array($result);
$recipie = $getrecipie['recipename'];
$ingredients = $getrecipie['ingredients'];
$method = $getrecipie['method'];
$time = $getrecipie['time'];
?>
<h1>Edit Recipies</h1>
<p> </p>
<form name="form1" method="post" action="startereditsuccess.php?rec=<?php echo $_GET['id']?>">
<table width="609" height="250" border="0">
<tr>
<td width="155">Recipie Name</td>
<td width="347"><label for="recipiename"></label> <input type="text" name="recipename" value="<? echo $recipe ?>" id="recipename" >
</td>
</tr>
<tr>
<td>Ingredients</td>
<td><label for="ingredients"></label> <textarea name="ingredients" cols="50" rows="5" id="ingredients"><? echo $ingredients ?></textarea></td>
</tr>
<tr>
<td>Method</td>
<td><label for="method"></label> <textarea name="method" cols="50" rows="5" id="method"><? echo $method ?></textarea></td>
</tr>
<tr>
<td>Time</td>
<td><label for="time"></label> <input type="text" name="time" value="<? echo $time ?>" id="time"></td>
</tr>
</table>
<p>
<input type="submit" name="update" id="update" value="Update">
</p>
</form>
这是我得到的错误:
警告:mysql_fetch_array()期望参数1为resource, boolean,在/home/jahedhus_public_html/cook/editdelete/starterseded .php第55行
请帮帮我,我迷路了!
首先,不要在你的帖子标题中大喊大叫。没必要。
第二,我们不需要一堆代码来显示所有的东西,当实际唯一相关的位是你的错误消息时。这个特定的错误消息意味着您的查询失败了(可能是由于语法错误),这意味着mysql_query()
返回了它通常的布尔值FALSE,而您没有检查它。您使用这个false作为语句句柄,并试图从中获取一行,这导致了实际的错误消息。
作为一般规则,永远不要假设数据库查询成功。即使查询字符串本身在语法上是100%有效的,也有许多其他原因可能导致查询失败。
基本的MySQL查询代码结构应该是:
$sql = "...";
$result = mysql_query($sql) or die(mysql_error());
这对调试/开发很有好处:如果查询失败,它会立即停止脚本并告诉您原因。对于产品代码,您需要一些更健壮的东西,而不是向用户发送长SQL错误消息。
在startsededit .php中调用mysql_query()
:
$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");
返回布尔值FALSE,因为发生了错误。当你调用mysql_query()
时,你应该添加一些错误处理代码来处理这个,例如:
$result = mysql_query("SELECT * FROM starters WHERE username = '". $_SESSION['myusername']."' AND recipie_id='{$_GET['rec']}'");
if($result === FALSE) {
echo "Database Error: ".mysql_error() ;
exit ;
}
$getrecipie = mysql_fetch_array($result);
上面的代码可能对开发错误检查更有用,在生产站点中,您可能希望捕获错误并显示更优雅的内容。
另外,我注意到你正在呼叫require_once '../database.php';
和include '../database.php';
。你不需要两者,只要第一个就可以了。