【问题标题】:Cannot post form, MySQL, PDO/PHP无法发布表单、MySQL、PDO/PHP
【发布时间】:2018-06-29 15:42:19
【问题描述】:

我正在尝试在this stackoverflow 问题答案的帮助下将两个输入字段发布到我的 MySQL 数据库。但是,我的数据库中没有任何输入,或者我的页面上没有任何错误。我错过了什么?数据库凭据有效,因为我的页面上也有它们的输出(此处未列出)

我将它添加到另一个线程的代码中(作为稍后包含的 cfg.php 文件):

<?php
class Database
{

    private $servername = 'mydomain.com';
    private $dbname = 'mydatabase';
    private $username = 'mydatabaseuser';
    private $password = 'mypassword';


    public function dbConnection()
    {


        $this->conn = null;

来自线程的代码:

        //check if submit button is clicked
        If (isset($_POST['submit'])) {
            try {
                $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

                // set the PDO error mode to exception
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // prepare sql and bind parameters
                $stmt = $conn->prepare("INSERT INTO subscribers (name, email)
    VALUES (:name, :email)");
                $stmt->bindParam(':name', $name);
                $stmt->bindParam(':email', $email);

                $name = $_POST['name'];
                $email = $_POST['email'];
                $stmt->execute();
                echo "New records created successfully";
            } catch (PDOException $e) {
                echo "Error: " . $e->getMessage();
            }
            $conn = null;
        }
else { echo "Not set"; } //Added by suggestion from Funk Forty Niner in this thread

我的结局:

    }
}
    ?>

表格代码:

<?php include 'cfg.php' ?>





<div class="container">
    <div class="container__item">
        <form class="form"  method="post"> <!-- updated with method as suggested by RamRaider in this thread -->
            <input type="text" name="name" class="form__field" placeholder="Your name" style="margin-bottom:10px;"/><br> <!-- updated from name-type to text-type as suggested by Funk Forty Niner and RamRaider in this thread -->
            <input type="email" name="email" class="form__field" placeholder="Your E-Mail Address" />
            <button type="submit" name="submit" class="btn btn--primary btn--inside uppercase">Send</button>
        </form>
    </div>

</div>

【问题讨论】:

  • 您没有完全按照发布的方式进行问答。错误报告将是您的朋友。
  • 告诉你什么;将else { echo "Not set"; } 添加到您的If (isset($_POST['submit'])) {...},您将亲眼看到您将收到“未设置”回显。
  • 您的其中一个输入不是有效的输入标记,即使在 HTML 5 中也是如此。
  • 谢谢!错误报告在 E_ALL 级别是/是 On,例如,当我删除右括号时它会起作用。我现在注意到输入标签错误“名称”,谢谢! PhpStorm 甚至指出了这一点,但我没有看 -_- 虽然仍然无法正常工作,并且没有错误。甚至添加了 else 语句。可能是因为它是一个按钮而不是一个输入字段吗? /:还添加了下面 RamRaider 建议的 method="post"。
  • 欢迎。好吧,按钮有一个提交类型,所以应该可以工作。立即查看 Ram 的答案并在其下发表评论以获得更多帮助。确保您的查询确实启动并具有正确的连接。

标签: php mysql database forms pdo


【解决方案1】:
<form class="form">

默认情况下,这将使用GET 作为方法

改成

<form class="form" method='post'>

并且,感谢@Funk Forty Niner 更加勤奋并指出了表单输入元素之一的错误

<input type="name" ...

应该是

<input type="text" ...

编辑

根据之前关于表单元素类型的建议并阅读了您的 cmets,我希望以下内容可能对您有所帮助。

无论您在 Database 类中拥有什么,似乎都没有给聚会带来任何好处 - 当您实际尝试 insert 时,它不会在您的代码中使用

对于连接脚本db.php,我建议保存在inc 文件夹中 - 将所有其他可重复使用的类和脚本存储在同一位置。

example directory structure

Directory of C:\wwwroot\public\html

20/01/2018  18:08    <DIR>          .
20/01/2018  18:08    <DIR>          ..
20/01/2018  18:07    <DIR>          assets
20/01/2018  18:08    <DIR>          content
20/01/2018  18:07    <DIR>          css
20/01/2018  18:07    <DIR>          images
20/01/2018  18:07    <DIR>          inc
20/01/2018  18:07    <DIR>          scripts

因此,当您需要包含文件(例如您的数据库连接脚本)时,请在使用 includerequire 之前像这样使用 set_include_path

set_include_path 'C:\wwwroot\public\html\inc';
include 'db.php';
/*etc*/

-

<?php

    $verbose=false;

    try{

        /*

            database connection script
            --------------------------
            db.php

        */

        $dbuser='root';
        $dbpwd='p4$$w0rD';
        $dbhost='localhost';
        $dbname='geronimo';


        /* optional attribibutes for the connection */
        $options=array( 
            PDO::ATTR_CURSOR                    =>  PDO::CURSOR_SCROLL,
            PDO::ATTR_PERSISTENT                =>  false,
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY  =>  true,
            PDO::ATTR_EMULATE_PREPARES          =>  false,
            PDO::MYSQL_ATTR_INIT_COMMAND        =>  "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci', @@sql_mode = STRICT_ALL_TABLES, @@foreign_key_checks = 1"
        );
        $dsn='mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname.';charset=utf-8';


        $conn=new PDO( $dsn, $dbuser, $dbpwd, $options );

    }catch( PDOException $e ){
        exit( $verbose ? $e->getTraceAsString() : 'Database connection error' );
    }

?>

以及处理表单提交的代码

<?php
    if( isset( $_POST['submit'], $_POST['name'], $_POST['email'] ) ) {
        try{
            /*

                Include the database connection. The path used to this
                needs careful attention

            */
            include 'db.php';

            $name=filter_input( INPUT_POST, 'name', FILTER_SANITIZE_STRING );
            $email=filter_input( INPUT_POST, 'email', FILTER_SANITIZE_EMAIL );


            $sql='insert into `subscribers` (`name`, `email`) values ( :name, :email )';
            $stmt=$conn->prepare( $sql );

            if( $stmt ){

                $stmt->bindParam(':name', $name );
                $stmt->bindParam(':email', $email );

                $result=$stmt->execute();
                echo $result ? 'ok' : 'fu manchu say ver bad foo';

            } else {
                throw new Exception('Failed to prepare sql query');
            }
        }catch( Exception $e ){
            echo $e->getMessage();
        }
    }
?>

【讨论】:

  • 当然...但是您在这里遗漏了一些东西。再次查看他们的输入 ;-)
  • 完全正确 - 看起来并没有比表单标签更远...
  • 感谢插件 ;-) 现在剩下的就是如果连接发生了。看到他们的课,不确定这是否有效,并且似乎缺少代码。好吧,球现在在 OP 的球场上,就像以前一样;-)
  • 感谢您的意见!仍然没有返回任何内容,甚至没有错误。错误报告正在工作(通过删除 cfg.php 中的最后一个蝶形括号进行检查)。我的数据库中什么也没有。应用了您建议的所有更改(以及 Funky 40 Niner)。
  • 你能从 cfg.php 中添加真正的代码吗 - 有没有被使用?
【解决方案2】:

我最终将其全部废弃,并使用here 中的以下内容,因为我还不太精通这一点。最后,我什至不知道如何将变量用于凭证并将它们存储在其他地方以供重复使用:

cfg.php:

<?php
// Insert data into mysql database called "subscribers" using PDO

if(isset($_POST['submit']))
{
try {
$pdoConnect = new PDO("mysql:host=mydomain.com;dbname=mydatabase", "myusername", "mypassword");
} catch (PDOException $exc) {
    echo $exc->getMessage();
    exit();
}

    $name = $_POST['name'];
    $email = $_POST['email'];

    $pdoQuery = "INSERT INTO `subscribers`(`name`, `email`) VALUES (:name,:email)";
    $pdoResult = $pdoConnect->prepare($pdoQuery);

    $pdoExec = $pdoResult->execute(array(":name"=>$name,":email"=>$email));

    if($pdoExec)
    {
        echo 'Thank you for your submission!';
    } else {
        echo 'Your sumission failed!';
    }
}
?>

index.php

<div class="container">
    <div class="container__item">
        <form class="form" method="post">
            <input type="text" name="name" class="form__field" required placeholder="Your name" style="margin-bottom:10px;"/><br>
            <input type="email" name="email" class="form__field" required placeholder="Your E-Mail Address" />
            <button type="submit" name="submit" class="btn btn--primary btn--inside uppercase">Send</button>
        </form>
    </div>

</div>

【讨论】:

  • 下一个谜团:如何将 echo 移动到 index.php 中的 div?
  • 我将整个代码从 if($pdoExec 移动到第二个 echo 的右括号到我的 index.php 中。我得到 ""Unexpected variable: pdoExec in ..../index.php on XX""行。然而,当提交表单时,显示成功消息并且没有错误......
  • 解决了!我发现我的 if/else 语句不在旧的 "if(isset($_POST['submit'])) {" 中,所以将它包装在 " if(isset($_POST['submit'])) { “我在其他任何地方使用它都可以解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多