1

我正在使用 PHP 数组来收集已添加到我的 MySQL 数据库中的用户输入。由于这是来自用户输入的信息,因此我使用数据库中的 num_rows 创建的变量来确定 for 循环通过显示我的数组值运行的次数。for 循环包含一个显示数组的一个值的表单和一个“like”按钮(type=submit),并重复此表单直到显示所有值(从最新到最旧),然后是一个“like”按钮每个。

我希望用户能够单击“喜欢”按钮,为该帖子添加“喜欢”。我遇到的问题是我拥有的代码正在为每个帖子添加一个“喜欢”(因为代码会检查是否按下了“喜欢”按钮,并且由于“喜欢”按钮是由for 循环,每个“喜欢”按钮都具有相同的名称)。我试图通过根据递增变量为“喜欢”按钮命名来纠正此问题,但如果名称是变量或数组,该按钮似乎不起作用。

这是我的代码:

<?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 循环。

4

2 回答 2

4

有很多表格来做到这一点是一种可能的解决方案,但我倾向于只有一个表格和几个按钮。主要问题似乎是,正如您所说,您将按钮称为相同的东西,这意味着您无法确定按下了哪个按钮。

一个非常基本的解决方法是这样做:

<input type='submit' name='likebtn_{$i}' value='Like' />

这至少会给你一个序数,你可以用它来区分按钮。但是,您最好posts在此循环中循环,因此您可以执行此操作(假设您id在此表中调用了一个主键:

<input type='submit' name='likebtn_{$post['id']}' value='Like' />

啊,是的,当你修复你的POST部分时(即当有人按下“喜欢”按钮时),你需要阅读 $_POST 中的内容并解析出被推送的内容。为了帮助调试它,暂时将它添加到您的 post 处理程序中:

print_r($_POST); exit();

这将为您提供需要解码的输出(检查每个帖子的输出是否不同)。您还需要更改您的if声明以检测帖子;改变这个:

if ($_POST['likebtn']) {

至:

if ($_POST) {

这是必要的,因为您现在没有要检测的单个名称,所以我们现在检测数组是否$_POST包含任何内容(如果有,我们知道这是一个后操作)。在这个里面,放print_r()上面,看看里面是什么。

现在,您可以采取以下措施来改进您的代码:

  • 目前尚不清楚该表的original作用,所以我可能会重命名它。
  • 当您已经完成时,您似乎对此表有几个查询SELECT * FROM original- 所以这里有太多查询
  • 请记住,在这样的系统中,您可能需要其他表,例如谁做了“喜欢”(可能称为user
  • 而不是for循环,将其切换到您的帖子表上的 while 循环。
  • 尽量不要在语句中放置大块的 HTML echo "x",因为一段时间后很难调试。最好跳出 PHP 模式,在 HTML 模式下使用简单的循环和变量输出。

编辑,以回应您的评论:

好的,我做了 if ($_POST) { print_r } 并为其中一篇文章获取了 Array ( [likebtn_4] => 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 操作的关联数组,并测试了每个键(即元素名称)以查看它是否包含字符串“likebtn_”。如果是这样,我将余数转换为整数,然后您可以在UPDATE语句中使用它。

于 2012-08-04T11:02:10.760 回答
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
}
于 2012-08-04T11:26:39.383 回答