PDO插入MySQL数据库不能与另一个PDO查询一起使用

时间:2015-02-10 13:32:33

标签: php mysql pdo

(我不知道标题是否具有描述性。我不确定问题出在哪里,因此很难找到一个好的标题。)

所以这就是事情。我想使用PDO将值(从HTML表单)插入到MySQL数据库中。

到目前为止一切顺利。我设法得到$ _POST ['xyz']值并成功将它们插入到数据库中。但现在我想确保只有一行具有相同的电子邮件地址($ email)和相同的问题ID($ qid)。我通过检查行计数来做到这一点,正如您在代码中看到的那样。不确定这是不是一个好方法。

现在我可以成功地不插入具有类似电子邮件地址的两行,但由于某种原因,我无法插入任何其他电子邮件地址的行。一直想弄清楚我做错了什么,但不能。所以这是代码。希望你能看到我在那里所做的事情(因为我不能)。

try {
        $cnnxn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_username, $db_password);
    } catch (PDOException $e2) {
        die("ERROR: " . $e2->getMessage());
    }

    $query2 = $cnnxn->prepare("SELECT count(*) as cnt FROM grdj_replies WHERE email = :email AND question_id = :qid");
    $query2->bindParam(':email', $email);
    $query2->bindParam(':qid', $qid);

    $isQueryOk = $query2->execute();

    if ($isQueryOk) {
      $count = $query2->fetchColumn();
      } else {
      trigger_error('Error executing statement.'); 
    }
    $query2->closeCursor();


      if ($count > 0){
          echo '<div class="tools-alert tools-alert-red"><p>Sähköpostiosoitteellasi <strong>'.$email.'</strong> löytyy jo tallennettu vastaus tähän tehtävään. Jos haluat muuttaa vastausta, seuraa sähköpostiosoitteeseesi lähetetyn viestin ohjeita.<p>';
          echo '<p>(<a href="#">Klikkaa tästä, jos haluat lähettää ohjeet uudestaan osoitteeseen '.$email.'</a>.)</p></div>';
      }

    else {

        $cnnxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTIONS);
        $cnnxn->exec("SET NAMES utf8");
        $query = $cnnxn->prepare("INSERT INTO grdj_replies (question_id, last_name, first_name, email, question_number, answer, status, accesstoken) VALUES (:qid, :lastname, :firstname, :email, :questionnumber, :answer, :status, :accesstoken)");
        $query->bindParam(':qid', $qid);
        $query->bindParam(':lastname', $last_name);
        $query->bindParam(':firstname', $first_name);
        $query->bindParam(':email', $email);
        $query->bindParam(':questionnumber', $question_number);
        $query->bindParam(':answer', $answer);
        $query->bindParam(':status', $status);
        $query->bindParam(':accesstoken', $accesstoken);
        $query->execute();

        if ($query !== false)
                    {
                        print "<div class=\"tools-alert tools-alert-green\">Vastauksesi on tallennettu!</div>";
                    }
        $query->closeCursor();
        $cnnxn = null; 
    }

2 个答案:

答案 0 :(得分:0)

首先,您正在使用 - &gt; bindParam(),其中 - &gt; bindValue()就足够了(可能更合适)。

你问你的输入处理是否是一种很好的做事方式:我看不到那段代码。而不是使用superglobals,使用filter_input()/ filter_input_array()

您描述的问题可能不在PHP代码中:仔细查看数据库索引。您是否通过qid对grdj_replies进行了唯一索引(例如,您是否仅在“qid”上拥有主键)?是否存在任何其他不足的索引阻止您在表中插入额外的行,对于相同的qid?也许你应该通过qid,电子邮件联合索引。

您将错误处理应用于PDO对象的创建(数据库连接);在这些情况下,我经常发现将错误处理(try / catch,$ error-&gt; getMessage())应用于SQL语句的执行是有帮助的(这样,你可以看到数据库试图告诉的内容)你是否因未运行查询而抛出借口/解释?)

答案 1 :(得分:0)

我建议您使用MySQL唯一索引:

ALTER TABLE `grdj_replies`   
  ADD  UNIQUE INDEX `UNIQUE_IDX` (`email`, `question_id`);

现在,MySQL会确保在插入新行之前没有其他行包含相同的电子邮件和question_id,您不必手动检查它#34;手动&#34;。 在已存在相同数据的情况下,INSERT请求将失败。