почему моя таблица пуста, когда у меня нет ошибки в коде php? - PullRequest
0 голосов
/ 20 октября 2019
<?php
    session_start();
?>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
</head>

Ребята, я делаю стол для покупок, и его зовут корзина. Я получаю идентификатор на имя таблицы продукта и цену тоже. и моя таблица корзины выглядит как

this(id[int],name[varchar],email[varchar],price[decimal],count[int],reduction[int],done[boolean]).

в конце, когда я нажимаю на сумку для покупок, эта ссылка может добавить счетчик, но моя таблица пуста, нет строки.

<body>

    <?php
        include"database.php";
        $name="";
        $price=0;
        $email=$_SESSION["email"];
        $done=false;
        $count=0;
        // i get id form product table and product table like this(id[int],description[text],price[decimal])//

        $id=$_GET["id"];
        $query="SELECT * FROM product WHERE id=:id";
        $result=$connect->prepare($query);
        $result->bindparam(":id",$id);
        $result->execute();
        while($row=$result->fetch(PDO::FETCH_ASSOC)){
            $name=$row["names"];
            $price=$row["price"];

        }

        // and write a query  for make count and insert or update in basket table;
        $sql="SELECT * FROM basket WHERE name=:name and email=:email and done=:done";
        $result=$connect->prepare($sql);
        $result->bindparam(":name",$name);
        $result->bindparam(":email",$email);
        $result->bindparam(":done",$done);
        $result->execute();
        while($row=$result->fetch(PDO::FETCH_ASSOC)){

            if(!empty($row["count"])){
                $count=$row["count"];
            }else{
                $count=0;
            }

        }

        if($count>0){
            $upquery="UPDATE basket SET count=:count WHERE name=:name";
            $result=$connect->prepare($upquery);
            $count++;
            $result->bindparam(":count",$count);
            $result->bindparam(":name",$name);
            $result->execute();
        }else{
            // for now i insert the info to table and give 0 value for reduction// 
            $count1=1;
            $reduction=0;
            $inquery="INSERT INTO basket (name,email,price,count,reduction)VALUES(:name,:email,:price,:count,:reduction)";
            $result=$connect->prepare($inquery);
            $result->bindparam(":name",$name);
            $result->bindparam(":email",$email);
            $result->bindparam(":price",$price);
            $result->bindparam(":count",$count1);
            $result->bindparam(":reduction",$reduction);
            $result->execute();
        }
    ?>
</body>
</html>

У меня нет ошибки PHP, так почему моя таблица пуста?

Я повторяю $ email и $ name и $ price и $ done и $ done и $ extension, и это правильно.

Что не так, пожалуйста, скажите мне, что я новичок в мире программистов.

1 Ответ

0 голосов
/ 21 октября 2019

Пытаясь уточнить ваш код, я обнаружил несколько вещей:

  1. Вы начинающий PHP и вам нужно много практики для написания стандартных кодов. Не волнуйся, продолжай кодировать. Это придет время. Итак, вот вам несколько золотых очков обучения.

  2. Вы использовали циклы while, которые совершенно не нужны здесь, в любом месте. Цикл while или любой другой цикл используется только тогда, когда вам нужно извлечь все записи (или ограничен кодированием). Вот почему это называется петлей. Он будет продолжать извлекать данные, пока не найдет их. Вы должны просто использовать простую выборку, когда цель состоит в том, чтобы просто использовать значения базы данных индивидуально в соответствии с выбранной вами записью (скажем, запись согласно where id = :id).

  3. Вы создали ненужныепеременные, которые не были нужны. Вы могли бы напрямую использовать эти значения при написании запросов. Параметризованные запросы необходимы только при отправке данных через форму, так как есть вероятность внедрения SQL. Для жесткого кодирования вы можете ввести прямые значения. Кроме того, во время выборки вы создали переменную, скажем $name, для хранения значения $row['names']. Это нормально, но многие разработчики не считают это хорошей практикой, поскольку каждая переменная использует немного памяти (для получения дополнительной информации воспользуйтесь поиском в Google). Вместо этого используйте везде $row['names'].

  4. session_start() отсутствовал в верхней части страницы. Без этого ваша переменная $email не будет распознавать значение сеанса (электронная почта). Если у вас уже есть это в database.php, тогда хорошо, но я бы рекомендовал использовать его отдельно на каждой странице (считается хорошей практикой), а не включать через внешний файл.

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

  6. Пожалуйста, не используйте просто $email = $_SESSION['email'], так как он вернет неопределенную ошибку, когда пользователь выйдет из системы или сеанс будет разрушен, и пользователь заходит на эту страницу. Используйте то, что я дал ниже. Он проверяет, является ли $_SESSION['email'] пустым или нет, и будет ли это значение равным нулю, предотвращая неопределенную ошибку, поскольку $email теперь определяется как пустое значение. Если сеанс существует, он будет использовать электронную почту из сеанса. Опять же, пожалуйста, используйте ID пользователя в следующий раз.

  7. Как сказал @nbk, ваш код смутил меня и действительно не имел никакого смысла. Почему вы хотите получить счет из той же таблицы, а затем обновить ту же таблицу и все. Это не имеет смысла.

Я все еще исправлял ошибки в вашем способе кодирования (это может не решить вашу проблему, поскольку я вообще не понимал вашего смысла в кодировании при подсчете и обновлении)в той же таблице, но скопируйте и вставьте его / сохраните где-нибудь), что должно помочь вам выучить стандартный способ написания кода. Пожалуйста, пройдите его, поймите и внесите необходимые изменения по мере необходимости. Надеюсь, что все это написанное и усилия помогут вам.

Вот ваш полностью улучшенный код со стандартным способом кодирования от начала до конца:

session_start();
include("database.php");
$email = (!empty($_SESSION['email']))?$_SESSION["email"]:null; // Please set user id here instead of email next time as you need to pass id in many places.
$done = false;

$product = $connect->prepare("SELECT * FROM product WHERE id = :id");
$product-> bindValue('id', $_GET['id']);
$product-> execute();
$p = $product->fetch(); // While loop is only needed when you want to fetch and display all the records (like in table format) otherwise NOT.

$basket = $connect->prepare("SELECT COUNT(*) as cnt FROM basket WHERE name = :name and email = :email and done = :done");
$basket-> bindValue(':name', $p['names']);
$basket-> bindValue(':email', $p['email']);
$basket-> bindValue(':done', $done);
$basket-> execute();
$b = $basket->fetch();

if($b['cnt'] > 0){
  $stmt = $connect->prepare("UPDATE basket SET count = :count WHERE name = :name");
  $stmt-> bindValue(':count', $b['cnt']);
  $stmt-> bindValue(':name', $p['names']);
}else{
  $count = $b['cnt']+1;
  $stmt = $connect->prepare("INSERT INTO basket(name, email, price, count, reduction)VALUES(:name, :email, :price, :count, :reduction)");
  $stmt-> bindValue(':name', $p['names']);
  $stmt-> bindValue(':email', $email);
  $stmt-> bindValue(':price', $p['price']);
  $stmt-> bindValue(':cost', $count);
  $stmt-> bindValue(':reduction', 0);
}
$stmt-> execute();
...