首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PDO插入到MySQL数据库中,不处理另一个PDO查询

将PDO插入到MySQL数据库中,不处理另一个PDO查询
EN

Stack Overflow用户
提问于 2015-02-10 13:32:32
回答 2查看 325关注 0票数 1

(我不知道这个标题是否是描述性的。我不知道问题出在哪里,所以很难找到一个好的头衔。)

事情是这样的。我想使用PDO将值(从HTML )插入到MySQL数据库中。

到目前一切尚好。我成功地获得了$_POST‘’xyz‘值,并成功地将它们插入DB中。但现在,我想确保只有一行具有相同的电子邮件地址($email)和相同的问题id ($qid)。我是通过检查行计数来做到这一点的,正如您在代码中看到的那样。不知道这是不是个好办法。

现在,我不能成功地插入具有类似电子邮件地址的两行,但由于某种原因,我不能插入任何行与任何其他电子邮件地址。一直在试图找出我做错了什么,但做不到。下面是代码。希望你能看到我在那里做了什么(因为我做不到)。

代码语言:javascript
复制
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; 
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-10 13:48:08

首先,您使用的是->bindParam(),其中->bindValue()就足够了(也许更合适)。

您会问您的输入处理是否是一种很好的做事方法:我看不见那段代码。与其使用超级全局,不如使用filter_input() / filter_input_array()

您描述的问题可能不是PHP代码中的问题:仔细看看数据库索引。您是否用qid唯一地索引了grdj_replies (例如,您是否只有"qid“的主键)?是否还有其他不适当的索引阻止您为相同的qid向表中插入其他行?也许你应该通过qid,电子邮件联合索引。

您可以将错误处理应用于PDO对象的创建(数据库连接);在这种情况下,我常常发现将错误处理(try/catch,$ error ->getMessage())应用于SQL语句的执行很有帮助(这样,您就可以看到数据库试图告诉您什么。它是否为不运行查询抛出了一个借口/解释?)

票数 0
EN

Stack Overflow用户

发布于 2015-02-10 13:54:38

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

代码语言:javascript
复制
ALTER TABLE `grdj_replies`   
  ADD  UNIQUE INDEX `UNIQUE_IDX` (`email`, `question_id`);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28432981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档