2017-02-02 7 views
-2

У меня есть страница, где пользователь хочет добавить новую категорию в базу данных, Я хочу проверить, добавлена ​​ли категория ранее в базе данных или нет, если она новая, добавьте ее в базу данных, она работает но он добавляет его много раз (равный данным в таблице), я знаю, что это из-за 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!"); 
      } 
     }) 
} 

Edit1 Я изменил его на следующий, и она работала хорошо, но как предупреждать пользователя, что эта категория вставлен раньше?

$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(); 
     } 
+0

Пожалуйста, добавьте тег для конкретной базы данных, используемой вами, если MySQL: [Лучший способ избежать дублирования записи в базу данных mysql] (http://stackoverflow.com/questions/2219786/best-way-to-avoid-duplicate -entry-in-mysql-database) –

+0

перед установкой инструкции вставки, если какая-либо запись существует с тем же именем, если да, чем ответ, поэтому нет необходимости в двух вызовах ajax. – Curiousdev

ответ

4

Попробуйте это:

<?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, что хорошо, там мой быть некоторые синтаксические ошибки в этом коде.

+0

Это будет работать, но есть гораздо лучшие способы, которые не включают чтение всей таблицы. Что произойдет, если категория добавляется другим пользователем между выбором и вставкой. –

+0

@AlexK. Я просто пытался заставить подход OP работать. Сделать этот столбец уникальным, как в ответе на упомянутый вами вопрос, будет лучшим подходом. Даже поиск категории в базе данных будет лучше. – Titus

+0

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

0

Вы можете сделать Category_Name в своей базе данных. Как уникальный индекс. Таким образом, база данных не может содержать дублированную гриву. и в вашем inerte Sql добавить дублированием KEY

Exemple

1

Логика неверен. Вы находите все существующие категории, а затем вставляете одну строку для каждой, которая не соответствует той категории, которую вы даете. Вам нужно добавить предложение where для SQL, чтобы выбрать только строки, соответствующие вашей категории, и затем он либо вернет одну строку, если категория существует, либо нет, когда нет. Затем оставшийся код должен вставлять только то, что количество строк будет равно нулю.