【问题标题】:why my table is empty when i have no error in php code?为什么当我的 php 代码没有错误时我的表是空的?
【发布时间】:2019-10-20 15:55:03
【问题描述】:
<?php
    session_start();
?>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
</head>

伙计们,我为购物袋做了一张桌子,它的名字叫篮子。我也得到了产品表名称和价格的 id。我的篮子桌就像

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 和 $reduction ,这是正确的。

有什么问题请告诉我我是程序员界的初学者。

【问题讨论】:

  • 为什么是selectupdate/insert?你就不能insert into ... on duplicate update吗?
  • 你的更新条款,没有多大意义。您所做的是更新该产品名称的所有客户计数,您确定您只有 1 件具有该名称的商品吗?
  • 嗨,您是什么意思?为什么更新是无意义的?当我的 $count>0 ...@nbk 时,我会写更新
  • 什么项目名称? @nbk
  • UPDATE ... WHERE name=:name" 你填写 $name=$row["names"]; 从产品表中它至少也是电子邮件

标签: php mysql phpmyadmin sql-update sql-insert


【解决方案1】:

在尝试优化您的代码时,我发现了一些事情:

  1. 你是一个完整的 PHP 初学者,你需要大量的练习来编写标准代码。别着急,继续写代码。它会随着时间到来。所以这里有一些黄金学习点供您参考。

  2. 您使用了 while 循环,这在每个地方都是完全没有必要的。仅当您需要获取所有记录(或受编码限制)时才使用 while 循环或任何其他循环。这就是为什么它被称为循环。它将继续获取数据,除非它不再找到。如果目标是根据您选择的记录单独使用数据库值(例如根据where id = :id 记录),您应该只使用简单的提取。

  3. 您创建了不需要的不必要变量。您可以在编写查询时直接使用这些值。仅当您通过表单提交数据时才需要参数化查询,因为存在 SQL 注入的机会。对于硬编码,您可以输入直接值。此外,在获取过程中,您创建了一个变量 $name 来存储 $row['names'] 的值。没关系,但许多开发人员不认为这是一个好习惯,因为每个变量都使用一点内存(搜索谷歌以获取更多信息)。在任何地方都只使用$row['names']

  4. session_start() 在页面顶部丢失。没有它,您的 $email 变量将无法识别会话值(电子邮件)。如果您已经在 database.php 中有它,那很好,但我建议在每个页面上单独使用它(被认为是一个很好的做法),而不是通过外部文件包含它。

  5. 请使用用户 ID 来存储会话而不是电子邮件,因为用户可以更改电子邮件,这将在未来破坏整个数据库并且它不可扩展。另一方面,自动递增的用户 ID 字段是我们从未接触过的,并且被认为是唯一的。因此,请使用用户 ID。

  6. 请不要只使用$email = $_SESSION['email'],因为当用户注销或会话被破坏并且用户访问该页面时,它将返回一个未定义的错误。改用我在下面给出的。它检查$_SESSION['email'] 是否为空,如果是,则该值将设置为null,以防止出现未定义的错误,因为$email 现在定义为null。如果会话存在,它将使用会话中的电子邮件。再次,请下次使用用户 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();

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多