我正在使用PHP数组来收集已添加到MySQL数据库的用户输入。由于这是来自用户输入的信息,因此我使用由数据库中的num_rows创建的变量来确定for循环在显示我的数组值时运行的次数。 for循环包含一个显示数组值的表单,以及一个“like”按钮(type = submit),并重复此表单直到显示所有值(从最新到最旧),并带有“like”按钮每个
我希望用户能够点击“赞”按钮,为该帖子添加“喜欢”。我遇到的问题是我的代码是为每个帖子添加一个“喜欢”(因为代码检查是否按下了“喜欢”按钮,并且因为“喜欢”按钮是由对于循环,每个“喜欢”按钮具有相同的名称)。我试图通过给“喜欢”按钮一个基于增量变量的名称来解决这个问题,但是如果名称是变量或数组,那么按钮似乎不起作用。
这是我的代码:
<?php
error_reporting (E_ALL ^ E_NOTICE);
session_start();
$userid = $_SESSION['userid'];
$username = $_SESSION['username'];
$userside = $_SESSION['side'];
echo "<b>Organized posts:</br><hr /></b>";
require("./postconnect.php");
$query = mysql_query("SELECT * FROM original ORDER BY postid ASC");
$numrows = mysql_num_rows($query);
$numrows = $numrows-1;
$sql = "SELECT postername FROM original ORDER BY postid ASC"; // select only the postername field from the table "original"
$result = mysql_query($sql); // process the query
$name_array = array(); // start an array
while($row = mysql_fetch_array($result)){ // cycle through each record returned
$name_array[] = "".$row['postername'].""; // get the postername field and add to the array above
}
$sql = "SELECT post FROM original ORDER BY postid ASC"; // select only the post field from the table "original"
$result = mysql_query($sql); // process the query
$post_array = array(); // start an array
while($row = mysql_fetch_array($result)){ // cycle through each record returned
$post_array[] = "".$row['post'].""; // get the post field and add to the array above
}
$sql = "SELECT posterside FROM original ORDER BY postid ASC"; // select only the posterside field from the table "original"
$result = mysql_query($sql); // process the query
$side_array = array(); // start an array
while($row = mysql_fetch_array($result)){ // cycle through each record returned
$side_array[] = "".$row['posterside'].""; // get the posterside field and add to the array above
}
$sql = "SELECT likes FROM original ORDER BY postid ASC"; // select only the likes field from the table "original"
$result = mysql_query($sql); // process the query
$likes_array = array(); // start an array
while($row = mysql_fetch_array($result)){ // cycle through each record returned
$likes_array[] = "".$row['likes'].""; // get the likes field and add to the array above
}
$i=$numrows;
for($i;$i>=0;$i--) {
if ($side_array[$i]==1) {
$color="red";
}
elseif ($side_array[$i]==2) {
$color="blue";
}
elseif ($side_array[$i]==3) {
$color="green";
}
echo "<form action='./memberhag.php' method='post'>
<table>
<tr>
<td><font color='$color'>$name_array[$i]</font> - $post_array[$i]</td>
</tr>
<tr>
<td><input type='submit' name='likebtn' value='Like' /> <font color=$color>$name_array[$i]</font> has $likes_array[$i] likes!</td>
</tr>
</table>
</form>";
if ($_POST['likebtn']) {
$numlikes = $likes_array[$i];
$numlikes = $numlikes + 1;
mysql_query("UPDATE original SET likes = '$numlikes' WHERE postername = '$name_array[$i]'");
}
}
?>
这让我难以忍受......我甚至尝试过使用while循环而不是for循环。
答案 0 :(得分:4)
有很多表单可以做到这一点是一种可能的解决方案,但我倾向于只有一个表单和几个按钮。主要的问题似乎是,正如你所说,你已经将按钮称为相同的东西,这意味着你无法确定哪一个被按下了。
非常基本的修复方法是:
<input type='submit' name='likebtn_{$i}' value='Like' />
这至少会为您提供一个序号,您可以使用它来区分按钮。但是,在这个循环中循环遍历posts
可能更好,所以你可以这样做(假设你在这个表中有一个名为id
的主键:
<input type='submit' name='likebtn_{$post['id']}' value='Like' />
啊,是的,当你修复你的POST
部分时(即有人按下'喜欢'按钮时的位),你需要阅读$ _POST中的内容并解析所推送的内容。要帮助调试此问题,请暂时将其添加到帖子处理程序中:
print_r($_POST); exit();
这将为您提供解码所需的输出(检查每个帖子的输出是否相同)。您还需要更改if
语句以检测帖子;改变这个:
if ($_POST['likebtn']) {
为:
if ($_POST) {
这是必要的,因为您现在没有要检测的单个名称,因此我们现在只检测数组$_POST
是否包含任何内容(如果有,我们知道这是一个post操作)。在其中,将print_r()
置于上方,以查看其中的内容。
现在,您可以采取以下措施来改进代码:
original
的作用,所以我可能会重命名。SELECT * FROM original
时,你似乎从这个表中有几个查询 - 所以这里的查询太多了user
)for
循环,将其切换到您的帖子表上的while循环。echo "x"
语句中放入大块HTML,因为一段时间后很难调试。最好是打破PHP模式,在HTML模式下使用简单循环和变量输出。编辑,以回应您的评论:
好的,我为其中一个帖子做了if($ _POST){print_r}并得到了Array([likebtn_4] =&gt; Like)。 :-) - 杰里米
大!好的,尝试这样的事情:
if ($_POST) {
$find = 'likebtn_';
foreach ($_POST as $key => $value) {
$likeKey = (int) str_replace($key, $find, '');
if ($likeKey) {
// If this runs, do your update against row $likeKey
// Note that I've forced it to be an int, to avoid security issues
}
}
}
最重要的是,尝试理解为什么这是有效的。如有必要,请做一些阅读。我基本上循环了post操作的 associative array ,并测试了每个键(即元素名称)以查看它是否包含字符串“likebtn_”。如果是,我将余数转换为整数,然后可以在UPDATE
语句中使用。
答案 1 :(得分:2)
这些查询中的任何一个都没有任何不同的逻辑。因此,明显(只读)要做的是将它们组合成一个语句。编写代码时,尽量少写。信不信由你,这将大大提高代码的质量。不要为了实现这个目标而牺牲清晰度,有时清晰度用较少的线表示,有时则不是。
我将假设您的数据库,并且您的唯一表格具有以下形式:
|postername|post|posterside|likes|
这意味着原始表中的每一行都有如上所述的相应列。
...所以
if(!empty($_POST) && !!$_POST['likebtn']) {
//Do your likebtn stuff here.
}
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$sql = "SELECT * FROM colums ORDER BY postid ASC";
$result = mysqli->query($sql);
while($row = $result->fetch_assoc()){
switch($row[2]) {
case 1:
$color = "red";
break;
case 2:
$color = "blue";
break;
case 3:
$color = "green";
break;
default:
//Handle when this case doesn't match
}
//The rest of your table would go hear, remember that $row[0] is the corresponding
//postername for said row. You will loop through rows until there are no more.
//Study Mysql injection, you are in danger of it now. Good luck
}