Возникли проблемы с увеличением поля в базе данных - PullRequest
0 голосов
/ 23 сентября 2019

Я создал базу данных, полную фильмов, которая связана с HTML-формой, информация о которой переносится с помощью PHP POST (действует как база данных фильмов).

Когда пользователь вводит поисковый запрос (Либо название, жанр, год или классификация) PHP скрипт search.php передается информация.

Все идет хорошо, однако у меня также есть столбец в моей БД, который называется times_searched со значением по умолчанию, равным нулю.

Мне кажется, что одна из больших проблем заключается в том, что у меня естья слишком долго смотрел на этот файл, и что-то простое для меня сейчас не очевидно.

Я очень плохо знаком с PHP и WebDev в целом.Я попытался выпустить второй оператор для выполнения внутри цикла foreach класса TableRow и попробовал разные синтаксисы и пытался связать предыдущие операторы с новыми операторами.

class TableRows extends RecursiveIteratorIterator
{
    function __construct($it) 
    {
        parent::__construct($it, self::LEAVES_ONLY);
    }

    function current() 
    {
        return "<td style='width:150px;border:1px solid black;'>" . 
        parent::current()."</td>";
    }

    function beginChildren() 
    {
        echo "<tr>";
    }

    function endChildren() 
    {
        echo "</tr>" . "\n";
    }
}

function printAssocArray($stmt)
{
    foreach (new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) 
            as $k=>$v) {
                    echo $v;
    }
}



require 'Templates/header.php';
//DB variables
$serverName = "localhost";
$userName = "root";
$password = "";

//Post variables
$title = ($_POST['title']);
$year = ($_POST['year']);
$genre = ($_POST['genre']);
$rating = ($_POST['rating']);

if (isset($_POST['submit'])) {
    try {
            //Create PDO object using DB variables
            $conn = new PDO(
                "mysql:host=$serverName;dbname=project_db", $userName, $password
            );
            //Set PDO error mode to exception
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "<h3 class='center'>Connection Successful!</h3>";


        if (!empty($_POST['title']) && empty($_POST['genre']) 
            && empty($_POST['rating']) && empty($_POST['year'])
        ) {
                $stmt = $conn->prepare(
                    "UPDATE movies SET 
                times_searched = times_searched + 1 WHERE id = :id; 
                IN (SELECT * FROM movies WHERE title LIKE '%$title%'"
                ); 
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
                $stmt->bindValue(':id', $result['id']);
                $stmt->execute();

         //Use function call to print information to table using TableRows
                printAssocArray($stmt);

        }elseif (!empty($_POST['genre']) && empty($_POST['rating']) 
            && empty($_POST['year']) && empty($_POST['title'])
        ) {
            $stmt = $conn->prepare(
                "SELECT * FROM movies WHERE genre LIKE '%$genre%'"
            );
            $stmt->execute();
            //Collect Result in associative array
            $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
            //Use function call to print information to table using TableRows
            printAssocArray($stmt);
        }

//New Block
if (!empty($_POST['title']) && empty($_POST['genre']) 
            && empty($_POST['rating']) && empty($_POST['year'])
        ) {
            $updateQuery = "UPDATE movies SET times_searched = times_searched + 1
             WHERE id IN (SELECT id FROM movies WHERE title LIKE :title)";

            $stmt = $conn->prepare($updateQuery); 
            $stmt->bindValue(':title', "%{$title}%");
            $stmt->execute();
            $outputQuery = "SELECT * FROM movies WHERE title LIKE :title";
            $stmt2 = $conn->prepare($outputQuery);
            $stmt2->bindValue(':title', "%{$title}%");
            $data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
            foreach ($data as $row) {
                foreach ($row as $v) {
                    echo $v, " ";
                }
                echo "<br>",\n;
            }

Цель состоит в том, чтобы попытаться вернуть запрошенныйзапрос из базы данных, затем увеличивайте столбец times_searched перед его печатью с использованием класса TableRow, это должно происходить при каждом запуске запроса (если страница обновляется, столбец times_searched должен увеличиваться)

Это используется для завершенияпроекта домашней работы, и безопасность не обязательно является фактором (хотя было запрошено использование PDO).

1 Ответ

0 голосов
/ 23 сентября 2019

Ваш запрос должен использовать WHERE id = :id (один элемент фильма) или WHERE id IN (SELECT id FROM movies WHERE title LIKE '%$title%') (несколько элементов фильма), а не оба, не разделенные ;.

Я предполагаю, что вы хотите использоватьпоследний (обновить несколько элементов фильма), изменить

$stmt = $conn->prepare(
                    "UPDATE movies SET 
                times_searched = times_searched + 1 WHERE id = :id; 
                IN (SELECT * FROM movies WHERE title LIKE '%$title%'"
                ); 
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
                $stmt->bindValue(':id', $result['id']);
                $stmt->execute();

на

$stmt = $conn->prepare("UPDATE movies SET times_searched = times_searched + 1 WHERE id IN (SELECT id FROM movies WHERE title LIKE :title)"); 
$stmt->bindValue(':title',"%{$title}%");
$stmt->execute();

Для части // New Block:

Заменить

$outputQuery = "SELECT * FROM movies WHERE title LIKE '%title%'";
$stmt2 = $conn->prepare($outputQuery);
$stmt2->bindValue('title', $title);

с

$outputQuery = "SELECT * FROM movies WHERE title LIKE :title";
$stmt2 = $conn->prepare($outputQuery);
$stmt2->bindValue(':title', "%{$title}%");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...