【问题标题】:Stop duplicate database entries on MVC php停止 MVC php 上的重复数据库条目
【发布时间】:2014-03-02 20:42:28
【问题描述】:

正如标题所示,我使用 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."; ";

}
}

?>

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 好的,所以在数据库级别执行它。其次,我意识到存在安全风险,但这只是一个不打算实际使用并且在本地运行的项目。你能给 num_rows 一些示例代码吗?最后,我没有注意到缺少 FROM ,所以谢谢。
    • 我明白,但这只是一个非常糟糕的习惯。总是逃避你的输入。假设您使用的是 mysqli,$result = $mysqli->query("insert here");然后使用 $result->num_rows.
    • 谢谢,我想看看转义输入。据我所知,我使用的是 mysql 而不是 mysqli
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多