【问题标题】:Using PDO and failing to insert a record使用 PDO 并未能插入记录
【发布时间】:2014-07-12 18:46:55
【问题描述】:

我在向数据库中添加记录时遇到了一个小问题。

由于某种原因,它没有将记录添加到数据库中。

我有一个 HTML 表单,并使用 jQuery 对其进行序列化以用于 AJAX 请求。我知道这很有效,因为我曾经将它与旧的 mysql 命令一起使用。

这就是我在 insert.php 文件中的内容:

$ln=($_POST['lastname']);
$fn=($_POST['firstname']);
$dob=($_POST['dob']);
$un=($_POST['username']);

$a1=($_POST['address1']);
$a2=($_POST['address2']);
$town=($_POST['town']);
$county=($_POST['county']);
$pc=($_POST['postcode']);
$country=($_POST['country']);
$lat=($_POST['lat']);
$lng=($_POST['lng']);

$lp=($_POST['landline']);
$mp=($_POST['mobile']);
$e1=($_POST['email1']);
$e2=($_POST['email2']);

$web=($_POST['web']);
$notes=($_POST['notes']);
$fb=($_POST['fbid']);
$tw=($_POST['twitter']);
$cat=($_POST['cat']);

$it=($_POST['Time']); 
$idate=($_POST['Date']); 
$iip=($_POST['ipaddress']);
$ib=($_POST['browser']);
$ios=($_POST['os']);

这些是表单中使用的发布值。

然后我有以下查询(我有 5 个不同的查询,因为它们正在写入 5 个表。正如我所说,这适用于旧的 mysql 命令,但不适用于 PDO 命令。

$sqlp = $conn->prepare("INSERT INTO ".PERSON." (lastname, firstname, dob, adbkid) VALUES(:ln, :fn, :dob, :un)");
$sqlp->execute();
$idp = $conn->lastInsertId();

$sqla = $conn->prepare("INSERT INTO ".ADDRESS." (address1, address2, town, county, postcode, country, lat, lng, personID) VALUES (:a1, :a2, :town, :county, :pc, :country, :lat, :lng, :un)");
$sqla->execute();
$ida = $conn->lastInsertId();

$sqlc = $conn->prepare("INSERT INTO ".CONTACT." (landline, mobile, email1, email2, personID) VALUES (:lp, :mp, :e1, :e2, :un)");
$sqlc->execute();
$idc = $conn->lastInsertId();

$sqlm = $conn->prepare("INSERT INTO ".MISC." (web, notes, photo, fbid, twitter, cat, personID) VALUES (:web, :notes, :pic, :fb, :tw, :cat, :un)");
$sqlm->execute();
$idm = $conn->lastInsertId();

$sqlv = $conn->prepare("INSERT INTO ".VARI." (Time, Date, ipaddress, browser, os, personID) VALUES (:it, :idate, :ip, :ib, :ios, :un)"); 
$sqlv->execute();
$idv = $conn->lastInsertId();

$sqlp->bindValue(':ln', $ln);
$sqlp->bindValue(':fn', $fn);
$sqlp->bindValue(':dob', $dob);
$sqlp->bindValue(':un', $un);

$sqla->bindValue(':a1', $a1);
$sqla->bindValue(':a2', $a2);
$sqla->bindValue(':town', $town);
$sqla->bindValue(':county', $county);
$sqla->bindValue(':pc', $pc);
$sqla->bindValue(':country', $country);
$sqla->bindValue(':lat', $lat);
$sqla->bindValue(':lng', $lng);

$sqlc->bindValue(':lp', $lp);
$sqlc->bindValue(':mp', $mp);
$sqlc->bindValue(':e1', $e1);
$sqlc->bindValue(':e2', $e2);

$sqlm ->bindValue(':web', $web);
$sqlm ->bindValue(':notes', $notes);
$sqlm ->bindValue(':pic', $pic);
$sqlm ->bindValue(':fb', $fb);
$sqlm ->bindValue(':tw', $tw);
$sqlm ->bindValue(':cat', $cat);

$sqlv ->bindValue(':it', $it);
$sqlv ->bindValue(':idate', $idate);
$sqlv ->bindValue(':iip', $iip);
$sqlv ->bindValue(':ib', $ib);
$sqlv ->bindValue(':ios', $ios);

我用 try catch 运行了这些,看看我是否能弄清楚发生了什么,我得到以下错误:

"SQLSTATE[HY093]: Invalid parameter number: no parameters were bound"

我已经回显了每个值中输入的内容,它与我在表单中输入的内容相对应。

我也在尝试回显每个表的最后插入的 ID,但它没有回显。

我浏览了 Google 和 php.net 以及这里以及我所读到的内容,我正在按照他们所说的去做。

我不知道发生了什么。

如果您有任何指点,他们将非常欢迎。

【问题讨论】:

  • 你应该在调用execute()之前绑定值

标签: php mysql sql pdo


【解决方案1】:

你必须先绑定参数然后执行它

即:

$sqlp = $conn->prepare("INSERT INTO ".PERSON." (lastname, firstname, dob, adbkid) VALUES(:ln, :fn, :dob, :un)");
$sqlp->bindValue(':ln', $ln);
$sqlp->bindValue(':fn', $fn);
$sqlp->bindValue(':dob', $dob);
$sqlp->bindValue(':un', $un);
$sqlp->execute();
$idp = $conn->lastInsertId();
...

【讨论】:

  • 我在执行它之前已经绑定了值,它没有返回任何东西说它已经输入到数据库中并且记录不存在
  • 配置pdo以通过$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );报告错误并使用print_r($sqlp->errorInfo());所以得到错误
  • 您好,感谢您的回复。我正在尝试,它似乎在执行所有语句时都失败了。我已经一一尝试过,它们似乎有效。这是否允许以这种方式执行它们?只是似乎无法理解它。谢谢
  • @chreese:我确实收到了一个错误,因为其中一个占位符是错误的。它现在正在插入记录,但由于某种原因,成功函数没有显示任何内容以表明插入成功
  • 当我通过 $.ajax 发布表单时,我查看控制台并显示 200 成功响应,它只是没有像以前那样将 echo 响应粘贴到 div 中跨度>
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 2016-06-13
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多