Использование Foreach для веб-сайта. Я хочу счетчик посещений с использованием PHP и MSQL

0

Поэтому я создаю сайт для фортепианной библиотеки для моего младшего кузена.

В настоящее время я использую функцию foreach для отображения всех данных из моей базы данных. Теперь это отлично работает, и мне удалось получить несколько функций, но у меня возникают проблемы с "счетчиком".

Супер простая концепция, за исключением того факта, что мне нужен счетчик для каждой отдельной записи.

Под "counter" я подразумеваю, что после нажатия ссылки он добавит +1 к счету. Так что каждая ссылка будет "посещать 100 раз" или "посещать 34 раза" и т. Д.

Я пробовал следующее:

if($mysqli){

    $result = mysqli_query($mysqli,"SELECT * FROM testtable ".$orderbyfilter);
    $rows = $result->fetch_all(MYSQLI_ASSOC);

    foreach($rows as $row) {
        echo "<tr id='entry'><td>";
        echo ucwords($row['name']);
        echo "</td><td align='center'>";
        echo '<a href="' . $row['url'] . '">url</a>';
        echo "add hit:";
        echo "<a href='?action=callfunction'>Click</a>";


        //current counter script

        if(isset($_GET['action']) && $_GET['action'] == 'callfunction'){
            $hitcount = $row['hitcount'] + 1;
            $id = $row['id'];

            // why doesn't this work?
            $sql="UPDATE testtable SET hitcount='$hitcount' WHERE id='".$id."'"; 
            $result=mysqli_query($con,$sql); 
        }

        echo "</td><td align='center'>";
        echo $row['level'];
        echo "</td><td align='center'>";
        echo $row['hitcount'];
        echo "</td></tr>";

    }

        mysqli_close($mysqli);

    } else {
        echo "table did not correctly display!";
}

Очевидно, что метод:

$sql="UPDATE testtable SET hitcount='$hitcount' WHERE id='".$id."'";

Не работает, так как когда я нажимаю ссылку, она обновляет все записи с одинаковым количеством попаданий. Однако, когда я меняю его на:

$sql="UPDATE testtable SET hitcount='$hitcount' WHERE id='2'";

Он отлично работает, где он только модифицирует hitcount для строки с id=2.

Очевидно, что проблема связана с "foreach" и значением $row[id] как переменной, но, честно говоря, я мог бы использовать некоторую помощь.

Связано ли это с переменной переменных? Я понятия не имею. Любая помощь приветствуется.

  • 0
    UPDATE table SET col_x = col_x +1 WHERE col_y = 'xyz' - проблема в том, что это в вашем цикле, зачем использовать его в первую очередь?
  • 0
    Привет Фред, я понимаю, что мне нужно использовать эту строку, чтобы получить то, что я хочу. Проблема, с которой я сталкиваюсь - это часть "ГДЕ". Мне нужно, чтобы «ГДЕ» автоматически изменялось таким образом, чтобы оно совпадало с идентификатором во время цикла foreach. В настоящее время WHERE ID = '$ id' не работает.
Показать ещё 5 комментариев
Теги:
counter
hitcounter
hit

2 ответа

0
Лучший ответ

Вот что сработало для меня. Вы можете изменить его в соответствии с требованиями.

Что нужно было сделать, так это передать дополнительный параметр GET для связанного "id" в URL-адресе, а затем передать эту переменную для него в WHERE.

Заголовок также был добавлен, чтобы автоматически перенаправлять, как только связанный URL-адрес с указанной строкой был нажат, и покажите результаты и чтобы предотвратить следующее предупреждение:

Предупреждение: mysqli_fetch_array() ожидает, что параметр 1 будет mysqli_result, boolean задан в...

Sidenote: прочитайте комментарии, оставшиеся в приведенном ниже коде для получения дополнительной информации.

<?php 
ob_start(); // keep this, it for the header

$DB_HOST = 'xxx'; // Replace
$DB_USER = 'xxx'; // with
$DB_PASS = 'xxx'; // your
$DB_NAME = 'xxx'; // own

$Link = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($Link->connect_errno > 0) {
  die('Connection failed [' . $Link->connect_error . ']');
}

// Your original query. You can replace it if needed.
// $result = mysqli_query($Link,"SELECT * FROM testtable ".$orderbyfilter);

$result = mysqli_query($Link,"SELECT * FROM testtable");

 while ($row = mysqli_fetch_array($result)) {

    echo "<tr id='entry'><td>";
    echo "ID: " . $row['id'];

    $var = $row['id']; // used for the URL

    echo "<br>";

    echo $row['hitcount'];
    echo ucwords($row['name']);
    echo "</td><td align='center'>";
    echo '<a href="' . $row['url'] . '">url</a>';
    echo " Add hit: ";
    echo "<a href='?action=callfunction&id=$var'>Click</a> ";

    if(isset($_GET['action']) && $_GET['action'] == 'callfunction'){

// Used for the query and escape the URL
$var = mysqli_real_escape_string($Link, $_GET['id']); 

$sql="UPDATE testtable SET hitcount = hitcount +1 WHERE id='".$var."'"; 

$result=mysqli_query($Link,$sql); 

// Added a header, otherwise the old method will generate the following warning
// Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in...
header("Location: http://www.example.com/your_counter_file.php");
exit; // Keep this in order to stop further execution

// ^ Change the url in header above to reflect your Web site address

    } // Closing brace for isset

    echo "</td><td align='center'>";
    echo $row['level'];
    echo "</td><td align='center'>";
    echo $row['hitcount'];
    echo "</td></tr>";

} // Closing brace for while loop

    mysqli_close($Link);
0

Просто измените свой запрос, как это, чтобы обновить счетчик

$sql="UPDATE testtable SET 'hitcount'=hitcount+1 WHERE id=".$id;

Не используйте одинарные кавычки вокруг значения счетчика, так как его integer

  • 0
    Спасибо за ваш вклад в синтаксис, буду обновлять его. Это все еще не работает. Все ссылки обновляют счетчик посещений всей таблицы.
  • 0
    нет, я использую значение имени столбца и добавляю к нему 1, что совпадает с `$ hitcount = $ row ['hitcount'] + 1;`, но в mysql

Ещё вопросы

Сообщество Overcoder
Наверх
Меню