哪个是编写用于插入数据的 PHP 代码的更好方法

Posted

技术标签:

【中文标题】哪个是编写用于插入数据的 PHP 代码的更好方法【英文标题】:Which is better way for write PHP code for insert data 【发布时间】:2020-09-20 18:57:45 【问题描述】:

我有些困惑,因为有些人编写这样的 php 代码来上传数据。 但我的导师总是使用$query$link 从SQL 上传和检索数据。

<?php
include 'connection.php';
function reg_in() 
    if (isset($_POST['submit'])) 
        $name = $_POST['name'];
        $email = $_POST['email'];
        $mob = $_POST['mobile'];
        $check_in = $_POST['in'];
        $check_out = $_POST['out'];
        $rm = $_POST['room'];
        $room_type = $_POST['type'];
        // Problem start from here
        if (mysql_query("INSERT INTO `book` (`name`,`email`,`mobile_no`,`check_in`,`check_out`,`room`,`room_type`) VALUES ('$name','$email','$mob','$check_in','$check_out','$rm','$room_type')")) 
            header('Location: C:/wamp/www/project/payment.html');
         else 
            echo mysql_error();
        
    

if (isset($_POST['submit'])) 
    reg_in();
//echo ' succesfully inserted';
 else 
    echo 'Not book';

MySQL(由我的导师提供):-

<?php

$link = mysqli_connect("myserver.com", "test", "sunil7117", "test");
if (mysqli_connect_error()) 
    die("please give correct permision");

//Is both are same!
//$query="INSERT INTO user(email,password) VALUES ('shivanandcpr25@gmail.com','sunil7117')";
$query = "UPDATE user SET email='test@gmail.com' WHERE email='abc@gmail.com' LIMIT 1";
echo mysqli_query($link, $query);
echo "<br>";

$query = "SELECT * FROM user";
if ($result = mysqli_query($link, $query)) 
    echo "welcome to database<br>";

    $row = mysqli_fetch_array($result);
    echo "my E-mail id is <strong> ".$row[1]. "</strong> and passoword is <strong>".$row[2]."</strong>";

【问题讨论】:

嗨,我不是在谈论 mysql_query()。我说的是我的教练总是使用一个变量,所以哪个更好 我认为这并没有太大的不同,尽管这取决于您的查询。但是您的讲师使用$link,因为对于mysqli,您首先必须连接到数据库,而$link 存储有关该连接的信息。但是,一旦您拥有用户提供的数据,就应该使用准备好的语句,这在 PDO 或 mysqli 中都是可能的,但在您正在使用的旧调用中却不是。 现在我想从 entry.php 添加我的 entry.html 文件。是否需要上课,或者我可以从'name'属性中获取所有数据因为在我的页面中我有很多 [input type=submit] 属性。那么我如何识别我的特殊提交数据 我不太确定你的意思是什么,也许你应该创建一个新问题,你可以在其中提供足够的细节以使其清楚。 ya droopsnot 我刚刚发布了新问题 【参考方案1】:

没有!

您的第一个示例使用了多年前从 PHP 中删除的函数。 mysql_query() 不存在,不应再使用。删除它的原因是您应该改用准备好的语句。它们由 mysqli 或 PDO 扩展提供。

你的第二个例子更好,但它太乱了。

你不应该echo mysqli_query。从这个函数中打印出任何有用的东西。 养成始终使用准备好的语句的习惯,并为可变数据使用占位符。到目前为止,您的查询是不变的,但使用准备好的语句仍然是一种很好的做法,以防您稍后需要添加参数。 避免使用像mysqli_fetch_array() 这样的函数。一个一个地迭代结果选项很麻烦,而且很少有用。 永远不要检查 mysqli 调用的返回值。没有用。改为启用错误报告。见How to get the error message in MySQLi? 始终设置正确的字符集。它应该是utf8mb4 99% 的时间。 SQL 查询可以保存在一个单独的变量中,但有什么意义呢?您只会将它作为参数传递给query 函数。无需使用中间变量。 不要使用 mysqli。您应该改用 PDO。如果您必须使用 mysqli,则为此目的创建一个简单的包装函数或类并执行您的通用函数,而不是使用 mysqli 函数。

这是我将如何做的一个例子。首先,我为 mysqli 启用错误报告,打开连接并设置字符集。然后我声明一个函数,它接受 3 个参数并返回一个数组。第一个参数是您刚刚打开的数据库连接。其次是带有占位符的 SQL 查询(如果有的话)。第三个是可选的,它是一个值数组,作为参数绑定到占位符。此函数适用于所有类型的 SQL 查询。其余的代码变得非常简单。

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = new mysqli("myserver.com", "test", "sunil7117", "test");
$link->set_charset('utf8mb4'); // always set the charset

/**
 * Executes an SQL query on the database.
 *
 * @param \mysqli $mysqli
 * @param string $query e.g. SELECT * FROM users WHERE username=?
 * @param array $params An array of parameters to be bound in the given order to the placeholders in SQL
 * @return array
 */
function prepared_query(\mysqli $mysqli, string $query, array $params = []): array 
    $stmt = $mysqli->prepare($query);
    if ($params) 
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    
    $stmt->execute();
    if ($result = $stmt->get_result()) 
        return $result->fetch_all(MYSQLI_BOTH);
    
    return null;


prepared_query($link, "UPDATE user SET email='test@gmail.com' WHERE email='abc@gmail.com' LIMIT 1");
echo "<br>";

$result = prepared_query($link, "SELECT * FROM user");
echo "welcome to database<br>";

if ($result) 
    $row = $result[0];
    echo "my E-mail id is <strong> ".$row[1]. "</strong> and passoword is <strong>".$row[2]."</strong>";

【讨论】:

以上是关于哪个是编写用于插入数据的 PHP 代码的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wordpress 中插入数据?

PHP,静态变量或私有变量哪个更好?

数据集与Sql查询(选择,过程,函数)哪个更好用?

哪种方法最适合批量插入?

PHP常见的低级错误

selenium 显示等待和隐式等待哪个更好