在MVC php上停止重复的数据库条目

时间:2014-03-02 20:42:28

标签: php mysql

正如标题所示,我使用MVC系统在数据库中显示表格。这也允许用户在表格中添加新条目。

我需要一种方法来阻止添加重复的条目,并且需要一条消息告诉用户他们已经是一个与他们输入的详细信息相匹配的条目。

此代码存储在controller_create.php文件中。我已经发布了整个文件以及sql文件中的create语句。停止复制的代码只需要对其中一个表起作用。

此代码是我目前所拥有的:

      if ($class_obj == "supplier")
  {
    $referred_as = $_POST['referred_as'];
    $query = mysql_query("SELECT COUNT(*) AS count `supplier` WHERE `referred_as` = ' " . $referred_as. " ' ");
    $result = mysql_query($query);
    if(mysql_num_rows($result) > 0) 
    {
        echo "Supplier already exists";
    }
    else
    {
        $sql = "INSERT INTO supplier (referred_as) VALUES ('".$_POST[referred_as]."')";
    }
  }

我认为即时通讯正确。欢迎任何帮助。

为供应商表创建声明:

--
-- Table structure for table `supplier`
--

CREATE TABLE IF NOT EXISTS `supplier` (
  `id` int(11) NOT NULL auto_increment,
  `goodsandservices` varchar(40) default NULL,
  `based` varchar(40) default NULL,
  `referred_as` varchar(40) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Dumping data for table `supplier`
--

INSERT INTO `supplier` (`id`, `goodsandservices`, `based`, `referred_as`) VALUES

Controller_create.php:

    <?
$class_obj=$_REQUEST['class_obj'];

$pino = array(); // this is a local array used to store retrieved attributes of selected objects

foreach ($_REQUEST as $key_REQUEST => $value_REQUEST)
{
if (substr($key_REQUEST,0,6) == 'input_')
{
if ($key_REQUEST != "input_id")
{
$pino = $pino + array(substr($key_REQUEST,6) => $value_REQUEST);
}
}
}
//echo "<P>.".print_r($pino);
  $this_obj = MyActiveRecord::Create($class_obj, $pino );

  $this_obj->save(); // crucial command: disactivate  only if you don't want to save...

  $last_inserted_record = $this_obj->id;

  $relation_name = $_REQUEST['jt_name'];
  $relation_class = $_REQUEST['jt_class'];



  if ($class_obj == "supplier")
  {
    $referred_as = $_POST['referred_as'];
    $query = mysql_query("SELECT COUNT(*) AS count `supplier` WHERE `referred_as` = ' " . $referred_as. " ' ");
    $result = mysql_query($query);
    if(mysql_num_rows($result) > 0) 
    {
        echo "Supplier already exists";
    }
    else
    {
        $sql = "INSERT INTO supplier (referred_as) VALUES ('".$_POST[referred_as]."')";
    }
  }


 // echo "<p>relation_name = ".$relation_name." - strpos = ".strpos ($relation_name,$class_obj)."";


  echo "<p>";

  foreach ($_REQUEST as $key_REQUEST => $value_REQUEST)
{
if (substr($key_REQUEST,0,9) == 'jt_input_')
{
//$pino = (substr($key_REQUEST,9) => $value_REQUEST);

$that_id = $value_REQUEST;
//echo " that_id = ".$that_id;
//echo " key = ".$key_REQUEST;


if (strpos($relation_name,$class_obj)>0)
{
$obj2 = $this_obj;
//$obj1 = $that_id;
$obj1 = MyActiveRecord::FindById($relation_class, $that_id);
}
else
{
$obj1 = $this_obj;
$obj2 = MyActiveRecord::FindById($relation_class, $that_id);
//$obj2 = $that_id;
}
//MyActiveRecord::Link($obj1,$obj2);
MyActiveRecord::Link($obj1,$obj2);
//echo "rel_name = ".$relation_name." - class = ".$class_obj." pos = ".strpos($relation_name,$class_obj)." obj1 = ".$obj1->id." - obj2 = ".$obj2->id."; ";

}
}

?>

1 个答案:

答案 0 :(得分:0)

有几点需要注意。首先,如果这是一个合法的硬约束,您不希望它被复制,请在数据库级别使用UNIQUE约束强制执行它。

其次,你不应该使用mysql_query。使用mysqli。你也没有逃避你的投入,这是一个巨大的安全风险。在PDO中使用预准备语句。说真的,现在就学这个。不这样做是不可接受的。

您可以使用mysqli_result对象中的num_rows来确定受影响的行数。如果它为0,并且没有任何错误,那么您可以放心地假设它已经存在并正确输出错误消息。

最后,您在SELECT中错过了“FROM”。

希望这有帮助。