我的代码中有2个sql查询,其中第二个查询包含if语句,只有在存在某个post值时才会执行。
但我仍然收到以下错误消息:
SQLSTATE [23000]:完整性约束 违规:1452无法添加或更新 子行:外键约束 失败(
database1
。table2
, 约束fk_referals_users1
FOREIGN KEY(users_id
)参考文献users
(id
)ON DELETE NO ACTION ON 更新无行动)
显然if语句不起作用,如果是,它就不会进入第二个sql查询。
以下是脚本的问题部分:
$STH = $DBH -> prepare( "insert into database1.table1 (display_name, email, password) values ( :display_name, :email, :password )" );
$STH -> bindParam( ':display_name', $_POST['display_name'], PDO::PARAM_STR, 100 );
$STH -> bindParam( ':email', $_POST['email'], PDO::PARAM_STR, 100 );
$STH -> bindParam( ':password', $_POST['password'], PDO::PARAM_STR, 100 );
$STH -> execute();
if( isset( $_POST['referer'] ) or ( $_POST['referer'] != null ) or ( $_POST['referer'] != "" ) ) {
$STH = $DBH -> prepare( "insert into database1.table2 ( username, status, users_id ) values ( :username, :status, :users_id )" );
$strStatus = 1;
$STH -> bindParam( ':username', $_POST['display_name'], PDO::PARAM_STR, 100 );
$STH -> bindParam( ':status', $strStatus, PDO::PARAM_INT, 1 );
$STH -> bindParam( ':users_id', $_POST['referer'], PDO::PARAM_INT, 1 );
$STH -> execute();
}
答案 0 :(得分:1)
您的一个if条件正在解析为true。
将复合if语句分解为3个嵌套ifs,并在每个级别添加一个echo以查看哪个失败。
答案 1 :(得分:1)
null
和""
是不同的值,因此如果它等于null
,它将不等于""
,并且IF将传递为真。我推荐这个if ( $_POST['referer'] && strlen($_POST['referer']) > 0 )
。这将检查它是否为null(如果未设置为null)并且是否存在长度大于0的字符串
答案 2 :(得分:0)
IF语句检查是否设置了某个POST值。您的外键约束检查POST字段中的值是否存在于users
表中。这两个条件无关。可以使用users
表中不存在的值设置POST字段。您应该在尝试插入之前检查用户表中是否存在该值(可能是COUNT吗?)(当然这取决于您的设置)
此外,您应该使用empty()
作为IF条件,因为isset()
即使值为空,也会将您的条件跳至TRUE。最好使用
if (!empty($_POST['referer'])) {
//your code here
}