Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在添加记录之前检查其他表中是否存在外键_Php_Mysql_Insert - Fatal编程技术网

Php 如何在添加记录之前检查其他表中是否存在外键

Php 如何在添加记录之前检查其他表中是否存在外键,php,mysql,insert,Php,Mysql,Insert,我知道有些问题的答案听起来是一样的,但我已经检查过了,我无法回答任何问题 我有一个recipes表,其中有“chef_id”和“category_id”列。 然后我有一个chefs表,其中有“id”和“name”列,还有categories表,其中还有“id”和“name”列 当我插入一个新的菜谱时,我必须添加厨师id和类别id,它们必须已经存在,否则,它应该告诉我在添加菜谱之前添加厨师和新类别 我应该如何以及在哪里检查?我正在使用SQLPDO。到目前为止,我得到的是: functions.ph

我知道有些问题的答案听起来是一样的,但我已经检查过了,我无法回答任何问题

我有一个recipes表,其中有“chef_id”和“category_id”列。 然后我有一个chefs表,其中有“id”和“name”列,还有categories表,其中还有“id”和“name”列

当我插入一个新的菜谱时,我必须添加厨师id和类别id,它们必须已经存在,否则,它应该告诉我在添加菜谱之前添加厨师和新类别

我应该如何以及在哪里检查?我正在使用SQLPDO。到目前为止,我得到的是:

functions.php

function add_recipe($name =':name', 
                   $categories_id=':categories_id',
                   $chef_id=':chef_id') {

         include 'db_connection.php';
    try {
        $sql = "INSERT INTO recipes(name, categories_id, chef_id) "
            . "VALUES (:name, :categories_id, :chef_id)";


        if(chef_id and category_id exist) {
            then execute the query;
        }

        $results = $conn->prepare($sql);
        $results->bindParam(':name', $name, PDO::PARAM_STR, 100);
        $results->bindParam(':categories_id', $categories_id, PDO::PARAM_INT);  
        $results->bindParam(':chef_id', $chef_id, PDO::PARAM_INT);   

    if($results->execute()) {
      echo '1 row has been inserted';  
    }

    $conn = null;

    } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage() . '<br />';
        return false;
    }
  return true;

}
函数add_recipe($name=':name', $categories_id=':categories_id', $chef_id=':chef_id'){ 包括“db_connection.php”; 试一试{ $sql=“插入食谱(名称、类别、厨师编号)” “值(:名称,:类别id,:厨师id)”; 如果(厨师长id和类别id存在){ 然后执行查询; } $results=$conn->prepare($sql); $results->bindParam(':name',$name,PDO::PARAM_STR,100); $results->bindParam(':categories_id',$categories_id,PDO::PARAM_INT); $results->bindParam(':chef_id',$chef_id,PDO::PARAM_INT); 如果($results->execute()){ 回显“已插入1行”; } $conn=null; }捕获(PDO$e){ 回显“错误:”。$e->getMessage()。
; 返回false; } 返回true; } 我认为唯一正确的是SQL检查约束。。。。但我希望不是这样,因为我发现很难理解它是如何工作的


谢谢大家!

而是在MySql中创建一个存储过程,以避免多次往返检查数据库

我将使用伪代码,因为现在在手机中:

  CREATE FUNCTION create_receipt(p_name, p_chef, p_category) 
  {
     int i_chef_id
     int i_category_id

     -- try to get chef_id if exist
     SELECT INTO i_chef_id
                 chef_id
     FROM chefs
     WHERE chef = p_chef

     if i_chef_id IS NULL {
        -- create new chef and get new created id
        INSERT chef  values (p_chef)

        SELECT INTO i_chef_id
                    chef_id
        FROM chefs
        WHERE chef = p_chef         
     }

     if not exist category {
        INSERT category values(category)
     }

     INSERT receipt  (name, i_chef_id, i_category_id) 
  }

只需从其他表的表名中选择一个
计数(id),其中id=:id
,查看是否得到任何结果,在你插入之前。但是如果可能的话,你怎么会使用
chef
category
ID,它们对应的行在那一点上不存在呢?对于
不存在的
,你需要做一个选择,看看你是否得到了一些东西。但因为所有发生在服务器端的事情都应该是快速的。uix,我很抱歉。你的意思是如果我是厨师,如果厨师id存在于厨师表上,我需要在厨师表上进行选择?选中新建编辑。如果两个厨师的名字相同,我可以在你的模型中看到一个问题,但这是一个不同的问题。。。。给我几分钟,要么我给你回电话,要么我投票决定答案。非常感谢。也会说西班牙语吗?