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

Итак, я создаю веб-сайт фортепианной библиотеки для своего младшего кузена.

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

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

Под "счетчиком" я подразумеваю, что после перехода по ссылке к счетчику добавляется +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'";

Он отлично работает, когда он изменяет количество попаданий только для строки с id=2.

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

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


person JohnSeuss    schedule 04.02.2015    source источник
comment
UPDATE table SET col_x = col_x +1 WHERE col_y = 'xyz' - проблема в том, что это в вашем цикле, зачем вообще его использовать?   -  person Funk Forty Niner    schedule 04.02.2015
comment
Привет, Фред, я понимаю, что мне нужно использовать эту строку, чтобы получить то, что я хочу. Проблема, с которой я сталкиваюсь, - это часть WHERE. Мне нужно, чтобы WHERE автоматически изменялся, чтобы быть тем же идентификатором, что и идентификатор во время цикла foreach. В настоящее время WHERE ID='$id' не работает.   -  person JohnSeuss    schedule 04.02.2015
comment
Вы также используете неправильную переменную соединения в $result=mysqli_query($con,$sql);, когда она должна быть $mysqli   -  person Funk Forty Niner    schedule 04.02.2015
comment
Спасибо, Фред, новичок во всем, что касается php. Сразу обновится до mysqli. Я использую цикл для перечисления своей базы данных, я не уверен, что вы имеете в виду под тем, что я использую в первую очередь?   -  person JohnSeuss    schedule 04.02.2015
comment
Сотрите мой комментарий об этом. Измените переменную и попробуйте еще раз, посмотрите, изменится ли это.   -  person Funk Forty Niner    schedule 04.02.2015
comment
Я не уверен, что вы подразумеваете под переменной. Я попытался изменить его на: $sql=UPDATE testtable SET hitcount='$hitcount' WHERE id='2'; где на самом деле есть число для id и оно работает на 100%. Однако мне нужно, чтобы он был динамическим, чтобы он автоматически размещал идентификатор строки без того, чтобы я вручную вводил #.   -  person JohnSeuss    schedule 04.02.2015
comment
Я разместил ответ для вас ниже, который сработал для меня. Вам придется изменить его, чтобы добавить теги таблицы, которые не были показаны в вашем коде, поэтому я не знал, куда их поместить.   -  person Funk Forty Niner    schedule 04.02.2015


Ответы (2)


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

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

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

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

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

<?php 
ob_start(); // keep this, it's 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's 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);
person Funk Forty Niner    schedule 04.02.2015

Просто измените свой запрос следующим образом, чтобы обновить счетчик

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

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

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