为什么我的PHP PDO Insert尝试导致SQLSTATE [23000]?

时间:2016-05-05 18:14:33

标签: php mysql pdo

我正在使用这个PHP PDO插入查询,我收到此错误,我的r_title为空,但当我在其上运行var_dump($r_title, $_POST['r_title'])时,它不会返回Null。整个错误如下所示 -

string(9)“我的评论”字符串(9)“我的评论”SQLSTATE [23000]:完整性约束违规:1048列'r_title'不能为空

该字段如何同时为Null和NOT null?

这是我的代码和各种尝试 -

输入查询

    $sql = $conn->prepare('INSERT INTO `reviews`(`r_date`, `r_title`, `v_name`, `v_email`, `host`, `host_type`, `r_features`, `r_security`, `r_service`, `r_reliability`, `r_overall`, `thumbs`, `comments`) 
                                         VALUES (:r_date, :r_title, :v_name, :v_email, :host, :host_type, :r_features, :r_security, :r_service, :r_reliablility, :r_overall, :thumbs, :comments)');

从表单中获取数据

$timestamp = time(); //F, j, Y -> Full Month, day of mo w/o leading zeros, full 4-digit year
$r_date = date("F/jS/Y",$timestamp);
$r_title = $_POST['r_title'];
$v_name = $_POST['v_name'];
$v_email = $_POST['v_email'];
$host = $_POST['host'];
$host_type = $_POST['host_type'];
$r_features = $_POST['r_features'];
$r_security = $_POST['r_security'];
$r_service = $_POST['r_service'];
$r_reliability = $_POST['r_reliability'];

$r_overall = ($r_features + $r_security + $r_service + $r_reliability) / 4;

$thumbs = $_POST['thumbs'];
$comments = $_POST['comments'];

绑定参数并执行

$sql->bindValue(':r_date', $r_date, PDO::PARAM_STR);
$sql->bindValue(':r_title', $r_title, PDO::PARAM_STR);
$sql->bindValue(':v_name', $v_name, PDO::PARAM_STR);
$sql->bindValue(':v_email', $v_email, PDO::PARAM_STR);
$sql->bindValue(':host', $host, PDO::PARAM_STR);
$sql->bindValue(':host_type', $host_type, PDO::PARAM_STR);
$sql->bindValue(':r_features', $r_features, PDO::PARAM_INT);
$sql->bindValue(':r_security', $r_security, PDO::PARAM_INT);
$sql->bindValue(':r_service', $r_service, PDO::PARAM_INT);
$sql->bindValue(':r_reliability', $r_reliability, PDO::PARAM_INT);
$sql->bindValue(':r_overall', $r_overall, PDO::PARAM_INT);
$sql->bindValue(':thumbs', $thumbs, PDO::PARAM_STR);
$sql->bindValue(':comments', $comments, PDO::PARAM_STR);
var_dump($r_title, $_POST['r_title']);
$sql->execute();

谁能看到我出错的地方?

1 个答案:

答案 0 :(得分:0)

我弄清楚我的问题是什么。

  

订单很重要!在尝试绑定它们之前定义变量!

当我在那里发布我的问题时,我注意到我提供的示例代码的顺序与我在代码编辑器中的顺序不同。我这样做是为了让那些阅读更容易理解。

在我的原始代码中,我从$ _POST []获取数据的部分是在我绑定值的部分之后。

没有人可以帮助我的原因是因为他们实际上不能看到这个问题。

  

请务必在编辑器中发布您的代码,以确保是否   订单有错误,其他人可以发现它并指出它   给你。

一旦我移动了我的$ _POST []信息上面我绑定我的值的部分,整个过程工作正常!

意思是,而不是以下,如我的例子所示:

ng-class-odd="'panel-info'"      <!-- blue panel class -->

ng-class-even="'panel-success'"  <!-- green panel class -->

<uib-accordion-group heading="{{group.title}}" ng-repeat="group in groups" 
     ng-class-odd="'panel-info'"  ng-class-even="'panel-success'">

我实际上在我的页面上有这个:

//get data from $_POST
$timestamp = time(); //F, j, Y -> Full Month, day of mo w/o leading zeros, full 4-digit year
$r_date = date("F/jS/Y",$timestamp);
$r_title = $_POST['r_title'];
$v_name = $_POST['v_name'];
$v_email = $_POST['v_email'];
$host = $_POST['host'];
$host_type = $_POST['host_type'];
$r_features = $_POST['r_features'];
$r_security = $_POST['r_security'];
$r_service = $_POST['r_service'];
$r_reliability = $_POST['r_reliability'];
$r_overall = ($r_features + $r_security + $r_service + $r_reliability) / 4;
$thumbs = $_POST['thumbs'];
$comments = $_POST['comments'];


//Bind Params and Execute

$sql->bindValue(':r_date', $r_date, PDO::PARAM_STR);
$sql->bindValue(':r_title', $r_title, PDO::PARAM_STR);
$sql->bindValue(':v_name', $v_name, PDO::PARAM_STR);
$sql->bindValue(':v_email', $v_email, PDO::PARAM_STR);
$sql->bindValue(':host', $host, PDO::PARAM_STR);
$sql->bindValue(':host_type', $host_type, PDO::PARAM_STR);
$sql->bindValue(':r_features', $r_features, PDO::PARAM_INT);
$sql->bindValue(':r_security', $r_security, PDO::PARAM_INT);
$sql->bindValue(':r_service', $r_service, PDO::PARAM_INT);
$sql->bindValue(':r_reliability', $r_reliability, PDO::PARAM_INT);
$sql->bindValue(':r_overall', $r_overall, PDO::PARAM_INT);
$sql->bindValue(':thumbs', $thumbs, PDO::PARAM_STR);
$sql->bindValue(':comments', $comments, PDO::PARAM_STR);
var_dump($r_title, $_POST['r_title']);
$sql->execute();