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!