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

标签 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."; ";

}
}

?>

最佳答案

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

其次,您不应该使用 mysql_query。使用mysqli。您也无法逃避您的输入,这是一个巨大的安全风险。将准备好的语句与 PDO 结合使用。说真的,现在就学习这个。不这样做是 Not Acceptable 。

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

最后,您的 SELECT 中缺少“FROM”。

希望这有帮助。

关于php - 停止 MVC php 上的重复数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133190/

相关文章:

mysql - 为什么我的左连接不起作用,显示零?

mysql - 使用跨 3 个表的简单联接优化 MySQL 查询

mysql - MySQL 嵌套循环中的多个游标

php - 向急需重构的代码库添加功能

使用 SQLite3 的 PHP PDO 错误

php - 使用 SQL 查询在 PHP 中生成二维数组

php - 无法在 centos 7 中安装 ssh2

Mysql表垂直合并

mysql - 显示MySQL中两列之间的所有关系

php - 用它在 php 中的当前值更新 MySql 值