Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 使用外键的PDO插入失败_Php_Mysql_Pdo - Fatal编程技术网

Php 使用外键的PDO插入失败

Php 使用外键的PDO插入失败,php,mysql,pdo,Php,Mysql,Pdo,对sql、php、pdo非常陌生,我正在尝试对现有帐户的项目表执行insert语句,但它一直失败。我看不出我错在哪里 结构如下 科目表 id=pk 项目表 id=pk 账户id=fk 项目名称=varchar(100) pm=varchar(100) apm=varchar(100) est_开始=日期 est_end=日期 联系人=varchar(100) 项目状态=varchar(100) 注释=文本 所有相关字段都是utf8\U unicode\U ci排序规则 对于XAMPP服务器上的i

sql
php
pdo
非常陌生,我正在尝试对现有帐户的项目表执行insert语句,但它一直失败。我看不出我错在哪里

结构如下

科目表
id=pk

项目表
id=pk
账户id=fk
项目名称=varchar(100)
pm=varchar(100)
apm=varchar(100)
est_开始=日期
est_end=日期
联系人=varchar(100)
项目状态=varchar(100)
注释=文本

所有相关字段都是utf8\U unicode\U ci排序规则
对于XAMPP服务器上的innodb
mySQL
db,限制设置为级联

php/pdo

<?php

include "$_SERVER[DOCUMENT_ROOT]/core/init.php";

if (empty($_POST) === false) {
    $fk = '';

    $title = $_POST['title'];

    try {
        $query_get_id = $db->prepare("
            SELECT accounts.id
            FROM accounts 
            WHERE accounts.account_name = ?         
        ");

        $query_get_id->bindValue(1, $title, PDO::PARAM_STR);
        $query_get_id->execute();
        $count = $query_get_id->rowCount();

        if ($count > 0) {
            while ($row = $query_get_id->fetch(PDO::FETCH_ASSOC)) {             
                $fk = $row['id'];
            }           
        } 

    } catch(PDOException $e) {
        die($e->getMessage());
    }

    $pn = $_POST['project_name'];
    $ppm = $_POST['project_pm'];
    $papm = $_POST['project_apm'];  
    $pc = $_POST['project_contact'];
    $pes = $_POST['project_est_start'];
    $pee = $_POST['project_est_end'];
    $ps = $_POST['project_status']; 
    $pcom = $_POST['project_comments']; 

    try {
        $query_ip = $db->prepare('INSERT INTO projects (account_id, project_name, pm, apm, est_start, est_end, contact, project_status, comments) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
        $query_ip->bindValue(1, $fk, PDO::PARAM_STR);       
        $query_ip->bindValue(2, $pn, PDO::PARAM_STR);
        $query_ip->bindValue(3, $ppm, PDO::PARAM_STR);
        $query_ip->bindValue(4, $papm, PDO::PARAM_STR);
        $query_ip->bindValue(5, $pes, PDO::PARAM_STR);
        $query_ip->bindValue(6, $pee, PDO::PARAM_STR);
        $query_ip->bindValue(7, $pc, PDO::PARAM_STR);
        $query_ip->bindValue(8, $ps, PDO::PARAM_STR);
        $query_ip->bindValue(9, $pcom, PDO::PARAM_STR);         

        $query_ip->execute();

        echo 'Project Created';     

    } catch(PDOException $e) {
        die($e->getMessage());
    }

} else {
    echo 'project creation failed';
}
?>
第50行是使用此代码执行语句的位置

$query_ip->execute();
我太新了,不能完全理解这个错误。我猜我的第一个怀疑是对的,我没有正确设置fk。我说得对吗

仅供参考,我在插入之前回显了我的变量,它们都设置好了,没有一个是空的,如果有人想知道的话

这并不是在说任何错误

这是您的主要问题。
而且必须是您最关心的问题。
您必须确保,如果发生错误,您将能够看到、阅读和理解它。
如果没有错误信息,你的工作就像赌博,而不是编程

一旦你得到了它,你可以通过谷歌搜索来修复它或者得到更多的解释。错误消息的搜索结果是最相关的结果之一

为了能够看到PDO错误,必须设置为exceptions。异常在许多方面都比常规错误好:它们总是包含堆栈跟踪,可以使用try..catch捕获或使用专用错误处理程序处理。即使未经处理,它们也充当常规PHP错误,提供所有重要信息,遵循站点范围的错误报告设置

请注意,将此模式设置为连接选项也会让PDO在连接错误时引发异常,这一点非常重要。
下面是一个正确创建PDO连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);
通过这种方式连接,您将始终收到查询执行期间发生的所有数据库错误的通知。请注意,您通常必须能够看到PHP错误。在一个实时站点上,你必须查看错误日志,因此,设置必须是

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
在本地开发服务器上,可以在屏幕上出错:

error_reporting(E_ALL);
ini_set('display_errors',1);
当然,您永远不应该在PDO语句前面使用错误抑制运算符(
@

此外,由于许多糟糕的示例告诉您将每个PDO语句包装到
try..catch
块中,因此我必须做一个明确的说明:

不要使用try..catch操作符只是为了回显错误消息。未捕获异常在这方面已经很好了,因为它的作用方式与其他PHP错误相同-因此,您可以使用站点范围的设置来定义行为-因此,您将收到没有此无用代码的错误消息。而无条件回显的错误消息可能会向潜在攻击者透露一些敏感信息,但会使诚实的访问者感到困惑

  • 可以稍后添加,但不是必需的。特别是对于新用户,建议使用未经处理的异常,因为这些异常信息丰富、有用且安全
  • 仅当您要处理错误本身时才使用
    try..catch
    ,例如回滚事务
这并不是在说任何错误

这是您的主要问题。
而且必须是您最关心的问题。
您必须确保,如果发生错误,您将能够看到、阅读和理解它。
如果没有错误信息,你的工作就像赌博,而不是编程

一旦你得到了它,你可以通过谷歌搜索来修复它或者得到更多的解释。错误消息的搜索结果是最相关的结果之一

为了能够看到PDO错误,必须设置为exceptions。异常在许多方面都比常规错误好:它们总是包含堆栈跟踪,可以使用try..catch捕获或使用专用错误处理程序处理。即使未经处理,它们也充当常规PHP错误,提供所有重要信息,遵循站点范围的错误报告设置

请注意,将此模式设置为连接选项也会让PDO在连接错误时引发异常,这一点非常重要。
下面是一个正确创建PDO连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);
通过这种方式连接,您将始终收到查询执行期间发生的所有数据库错误的通知。请注意,您通常必须能够看到PHP错误。在一个实时站点上,你必须查看错误日志,因此,设置必须是

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
在本地开发服务器上,可以在屏幕上出错:

error_reporting(E_ALL);
ini_set('display_errors',1);
当然,您永远不应该在PDO语句前面使用错误抑制运算符(
@

此外,由于许多糟糕的示例告诉您将每个PDO语句包装到
try..catch
块中,因此我必须做一个明确的说明:

不要使用try..catch操作符只是为了回显错误消息。未捕获异常在这方面已经很好了,因为它的作用方式与其他PHP错误相同-因此,您可以使用站点范围的设置来定义行为-因此,您将收到没有此无用代码的错误消息。而无条件回显的错误消息可能会向潜在攻击者透露一些敏感信息,但会使诚实的访问者感到困惑

  • 可以稍后添加,但不是必需的。特别是对于新用户,建议使用未经处理的异常,因为这些异常信息丰富、有用且安全
  • 仅当您要执行以下操作时,才使用
    try..catch
    Column______Internal relation_______Foreign key constraint (INNODB)
    id          <blank dropdown>        <blank drop down>
    account_id  <blank dropdown>        <blank drop down>
    name        <blank dropdown>        no index found!
    
    Column______Internal relation_______Foreign key constraint (INNODB)
    id          <blank dropdown>        <blank drop down>    
    account_id  <db.accounts.id>         <`db`.`accounts`.`id`> ON DELETE <CASCADE> ON UPDATE <CASCADE>
    name        <blank dropdown>        no index found!