【问题标题】:How to check items in the database and add it if new?如何检查数据库中的项目并添加新项目?
【发布时间】:2017-06-19 13:27:00
【问题描述】:

我有一个页面,用户想要在其中向数据库添加新类别, 我想检查该类别是否已经添加到数据库中,如果是新的,将其添加到数据库中,它工作正常,但它添加了很多次(等于表中的数据)我知道是因为foreach,怎么办?还有如何提醒用户它已经存在?

php代码:

  <?php
    include_once "connect.php";

    $stmt ="SELECT distinct Category_Name FROM Categories";

    foreach ($conn->query($stmt) as $row) 
    {
        if ($row['Category_Name'] != $_POST["CatName"])
        {
            $sql ="INSERT INTO Categories (Category_Name) VALUES (:CatName)";

            $result=$conn->prepare($sql);
            $result->bindparam(':CatName', $_POST["CatName"], PDO::PARAM_INT);
            $result->execute();
        }
        else
        {
            return false;
        }
    }

?>

Javascript 代码:

function AddNewCategory()
{
  var CatName=document.getElementById("CatNametxt").value;
  $.ajax({
            type:"POST",
            url:"add_category.php",
            data:'CatName=' + CatName,
            success: function(data)
            {
                alert("Category Added Successfully!");
            }
        })
}

编辑1 我把它改成了下面的,它工作得很好,但是如何提醒用户之前插入了这个类别?

$stmt ="SELECT * FROM Categories WHERE Category_Name='".$_POST["CatName"]."'";
$queryresult = $conn->query($stmt)->fetchAll(PDO::FETCH_ASSOC);
if (count($queryresult) == 0)
        {
            $sql ="INSERT INTO Categories (Category_Name) VALUES (:CatName)";
            $result=$conn->prepare($sql);
            $result->bindparam(':CatName', $_POST["CatName"], PDO::PARAM_INT);
            $result->execute();
        }

【问题讨论】:

标签: javascript php sql ajax pdo


【解决方案1】:

试试这个:

<?php
    include_once "connect.php";

    $stmt ="SELECT distinct Category_Name FROM Categories";
    $exists = false;
    foreach ($conn->query($stmt) as $row) {
        if ($row['Category_Name'] == $_POST["CatName"]) {
            $exists = true;
        }
    }
    if(!$exists) { // The category doesn't exist.
        $sql ="INSERT INTO Categories (Category_Name) VALUES (:CatName)";

        $result=$conn->prepare($sql);
        $result->bindparam(':CatName', $_POST["CatName"], PDO::PARAM_INT);
        $result->execute();
    }
    return $exists;
?>

我们的想法是遍历所有类别以确定用户定义的类别是否存在。

就像现在一样。每次数据库中的类别名称不同时,您的代码都会插入新类别。

你也可以这样做:

$result=$conn->prepare("SELECT COUNT(Category_Name) as total FROM Categories WHERE Category_Name = (:CatName)");
$result->bindparam(':CatName', $_POST["CatName"], PDO::PARAM_STR);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
    $exists = $row["total"] > 0;
}

我不太了解PHP,这段代码中有一些语法错误。

【讨论】:

  • 这可行,但有更好的方法不涉及读取整个表格。如果另一个用户在选择和插入之间添加了一个类别会发生什么。
  • @AlexK。我只是想让 OP 的方法起作用。使该列与您提到的问题的答案一样独特将是一种更好的方法。即使在数据库中搜索类别会更好。
  • 为什么不只搜索用户正在插入的类别,然后如果找到不插入其他插入,这样您就不必阅读整个表格
【解决方案2】:

逻辑不正确。您正在查找所有现有类别,然后为每个与您提供的类别不匹配的类别插入一行。您需要在 SQL 中添加一个 where 子句以仅选择与您的类别匹配的行,然后当类别存在时它将返回一行,或者在不存在时则不返回。剩下的代码应该只插入行数为零的地方。

【讨论】:

    【解决方案3】:

    您可以在数据库中将 Category_Name 作为索引唯一,这样数据库就不能插入重复的鬃毛。并在您的惰性 SQl 添加 ON DUPLICATE KEY

    Exemple

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多