【问题标题】:Inserting data into database with PHP使用 PHP 将数据插入数据库
【发布时间】:2017-11-26 22:50:07
【问题描述】:

问题是:如何将用户输入的数据发送到数据库,经过 filter_input 过滤并保存到关联数组中。我尝试这样做的方式是,即使我正在用过滤的、经过清理的输入填充数组,我也会收到错误消息,指出filtered_inputs 数组的每个字段的索引未定义。另外,如果有人知道这样做的替代方法或更好的方法,请告诉。有问题的数据库是 MariaDB mySQL 方言。一切都放置在服务器上并运行并使用分配给服务器的 phpmyadmin。

<?php require_once("Filtering.php");

$filter = new Filtering();

$filter->connect();

if (isset($_POST['submit'])){
    $filter->insertAll();
}

?>
<!DOCTYPE html>
<html lang="en">

<head>
</head>

<body>

<div class="container-fluid">
    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST" name="order" novalidate>
        <fieldset>
            <legend>Order Summary</legend>
            <br>
            <div class="row">
                <div class="col-12 d-flex flex-row">
                    <div class="col-4">
                        <span><strong>Product Name</strong></span>
                    </div>
                    <div class="col-2 justify-content-center">
                        <span><strong>Quantity</strong></span>
                    </div>
                    <div class="col-3 justify-content-center">
                        <span><strong>Price</strong></span>
                    </div>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-12 d-flex flex-row">
                    <div class="col-4">
                        <span>Gigabyte GTX1060 G1 Gaming 3GB GDDR5</span>
                    </div>
                    <div class="col-2 justify-content-center">
                        <select class="form-control col-3" id="quantity">
                        </select>
                    </div>
                    <div class="col-3 justify-content-center">
                        <span id="price">$ 349.99</span>
                    </div>
                </div>
            </div>
        </fieldset>
        <br>
        <fieldset>
            <legend>Customer Information</legend>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-2">
                        <label class="col-form-label">First Name<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Enter your first name" type="text" name="firstName">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterFirstName()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-2">
                        <label class="col-form-label">Last Name<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Enter your last name" type="text" name="lastName">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterLastName()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-2">
                        <label class="col-form-label">E-mail<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Enter your e-mail" type="text" name="email">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterEmail()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-2">
                        <label class="col-form-label">Number<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control noButton" placeholder="Enter your number" type="number"
                               name="number">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterNumber()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
        </fieldset>
        <br>
        <br>
        <fieldset>
            <legend>Payment Information</legend>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Card Number<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control noButton" placeholder="xxxx-xxxx-xxxx-xxxx" type="number"
                               name="cardNum">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterCard()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty. Must not be longer than 16 digits</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Expiration Date<span class="required">*</span></label>
                    </div>
                    <div class="col-2">
                        <input class="form-control" placeholder="MM/YY" type="text" name="expDate">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterExpDate()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty. Enter a valid date format: 'MM/YY'</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Security Number<span class="required">*</span></label>
                    </div>
                    <div class="col-2">
                        <input class="form-control noButton" placeholder="xxxz" type="number" name="secNum">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterSecurityNum()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty. Must be at most 4 digits long</small>
                             </div>
                          </div>";
                }
            }
            ?>
        </fieldset>
        <br>
        <br>
        <fieldset>
            <legend>Delivery Information</legend>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <label class="form-check-label">
                        <strong>Delivery Option</strong>
                    </label>
                </div>
            </div>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <label class="form-check-label">
                        <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1"
                               value="option1" checked>
                        Standard Delivery - Free of charge
                    </label>
                </div>
                <div class="col-8 d-flex flex-row">
                    <label class="form-check-label">
                        <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1"
                               value="option1">
                        Express Delivery - $ 5.99
                    </label>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Address Line 1<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Enter your address" type="text" name="address">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterAddress()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Address Line 2</label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Optional" type="text" name="address2">
                    </div>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Country</label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" value="Croatia" type="text" name="country" disabled>
                    </div>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">County</label>
                    </div>
                    <div class="col-auto">
                        <select class="custom-select" id="county">
                        </select>
                    </div>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">City<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control" placeholder="Enter your city" type="text" name="city">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterCity()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty.</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-3">
                        <label class="col-form-label">Zipcode<span class="required">*</span></label>
                    </div>
                    <div class="col-auto">
                        <input class="form-control noButton" placeholder="Enter your zipcode" type="number" name="zip">
                    </div>
                </div>
            </div>
            <?php
            if ($_SERVER["REQUEST_METHOD"] == "POST") {
                if (!$filter->filterZip()) {
                    echo "<div class='row'>
                             <div class='col-5'>
                                  <small class='text-muted ml-3 warning'>! Field must not be empty. Must be at most 5 digits long</small>
                             </div>
                          </div>";
                }
            }
            ?>
            <br>
            <div class="col-auto">
                <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                    <input type="checkbox" class="custom-control-input">
                    <span class="custom-control-indicator"></span>
                    <span class="custom-control-description">Receive mails about news and special offers</span>
                </label>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-auto">
                        <label class="col-form-label">Additional Information</label>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <div class="col-5">
                        <textarea class="form-control" id="txtarea" rows="5" name="additionalInfo"></textarea>
                    </div>
                </div>
            </div>
            <br>
            <div class="row">
                <div class="col-8 d-flex flex-row">
                    <input class="btn btn-primary col-2 ml-3" type="submit" name="submit" value="Submit">
                </div>
            </div>
        </fieldset>
    </form>
</div>
<script src="js/script.js"></script>
</body>

</html>

这里是 PHP 类:(我使用相同的函数过滤几乎每个输入字段,但我删除了它们,因此这里的代码更少。基本上每个过滤器方法都使用它的关联名称向数组添加一个新元素: firstName、lastName、email 等)由于某种原因,当我尝试插入应该将数据发送到数据库的 insertAll() 时,数组似乎为空。

<?php
class Filtering {

    public $filtered_inputs = array();
    public $error = array();

    var $tableName = "contact";
    var $connection;

    public function connect() {

        $this->connection= mysqli_connect($this->DBHostName, $this->DBUserName, $this->DBPassword, $this->DBName);

        if(!$this->connection) {
            print("Failed to connect to DB");
            die("Connection to database failed. " . mysqli_error($this->connection));
        }
        else {
            print("Connected to DB");
        }
    }

    public function filterFirstName() {
        global $filtered_inputs;
        global $error;
        $check = false;

        if (filter_has_var(INPUT_POST, 'firstName')) {
            if (strlen($_POST['firstName']) == 0) {
                $check = false;
            } else {
                $filtered_inputs['firstName'] = filter_input(INPUT_POST, 'firstName', FILTER_SANITIZE_STRING);
                $check = true;
            }
        }
        $error['firstName'] = $check;
        return $check;
    }


    public function insertAll(){
        var_dump($this->filtered_inputs);

        $firstName = $this->filtered_inputs['firstName'];
        $lastName = $this->filtered_inputs['lastName'];
        $eMail = $this->filtered_inputs['email'];
        $number = $this->filtered_inputs['number'];
        $cardNum = $this->filtered_inputs['cardNum'];
        $secNum = $this->filtered_inputs['secNum'];
        $address = $this->filtered_inputs['address'];
        $city = $this->filtered_inputs['city'];
        $zip = $this->filtered_inputs['zip'];;

        $query = "INSERT INTO contact (firstName, lastName, eMail, number, cardNum, secNum, address, city, zip) VALUES ($firstName, $lastName, $eMail, $number, $cardNum, $secNum, $address, $city, $zip);";

        print(mysqli_error($this->connection));
    }

}

【问题讨论】:

  • 你应该避免在任何地方使用全局变量......好吧......另外,你应该学习如何使用prepared statements

标签: php mysql arrays database


【解决方案1】:

有几个问题(参见 cmets),但这里的主要问题是调用函数的顺序。

各个过滤器函数嵌入在表单本身中,因此在此行之后调用:

$filter->insertAll();

所以实际上数组还是空的,函数正在尝试插入空值。

您需要重新排列,以便在尝试插入值之前调用各个函数。

【讨论】:

    【解决方案2】:

    你的第一个问题在这里:

    class Filtering {
        ...
        var $connection;
    
        public function connect() {
    
            $this->connection= mysqli_connect($this->DBHostName, $this->DBUserName, $this->DBPassword, $this->DBName);
    

    您看到$this-&gt; 表示在当前类中查找此变量,因此数据库连接正在寻找:

    class Filtering {
        var $connection = "something"; // var is optional and not really needed.
        $DBHostName = "host";
        $DBUserName = "user"; 
        $DBPassword = "pass"; 
       // Etc.
    

    您尚未表明您已设置这些连接详细信息,因此您的脚本将永远不会连接到数据库。


    接下来,你全局使用。作为referenced by tereško,使用global 是不明智的,您根本不需要在这段代码中根本

    您正在引用已在类中建立的值;所以只需使用神奇的$this-&gt; 功能来调用它(令人惊讶的是,我找不到任何专门针对$this 的体面的参考资料),这样你就不会去混淆变量,而是保持整洁在课堂上。

    例子:

      public function filterFirstName() {
            $this->filtered_inputs['firstName'] = "something";
    

    您请求的问题:

    下一个; var_dump($this-&gt;filtered_inputs); 没有输出数据的问题,您正在调用并转储变量在它被赋予任何值之前

    阅读您的表单/HTML 代码;您在页面后面调用 $filter-&gt;insertAll(); 之前,调用实际上将任何值保存到变量的filterFirstName() 函数。


    将表单提交到表单来自的同一页面是不好的表单;如果我刷新页面然后$_POSTed 数据将重新提交,每次。 (这个代码库还有许多其他问题)


    此外,您似乎没有将数据发送到 MySQL 数据库的任何代码,也许您只是没有显示它,但您 确实 有 SQL string ($query) 但是你应该有一个使用这个字符串的指令:

     $this->connection->query($query);
    

    这是上面一个非常基本的示例,它是 highly recommended 你探索 - 并使用 - Prepared Statements


    简化您的代码:

    改进是不断滚动的努力,您的问题似乎是您正在为表单提供给 PHP 的每个输入写 hardcode;报废那个;这是重复和浪费的。

    尝试使用foreach 遍历an array 中的每个元素:

    public function processFilter() {
        $check = false;
    
        foreach($_POST as $key=>$value){
            if (strlen($_POST[$key]) == 0 && $key == 'firstName') {
                $check = false;
            } 
           else {
                $this->filtered_inputs[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_STRING);
                $check = true;
            }
        }
        unset($key,$value);
    
        return $check;
    }
    

    这段代码可以进一步减少并提高效率,但我只是想给你一个开始;此函数现在将使用每个 POST 语句无缝填充您的 -&gt;filtered_inputs 数组,并将检查 firstName 键是否不是零长度字符串。

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 2017-10-03
      • 2023-03-05
      • 1970-01-01
      • 2014-10-18
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多