试图创建一个类似于Facebook的“喜欢”系统

时间:2012-08-04 10:50:59

标签: php mysql arrays facebook facebook-like

我正在使用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循环。

2 个答案:

答案 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
}