如何使用 MySqli/PHP 插入表单数据


How to insert form data using MySqli/PHP?

我正在尝试使用mysqli,php插入表单数据。我遇到的问题是它在表格中插入"?"作为表单值,而不是我在表单中键入的内容?我知道我在某个地方出错了,但我无法弄清楚。

我的附加问题是:使用这样的 mysqli 语句从数据库中插入或选择数据是否安全,因为我想 $_POST 成为注入攻击的威胁。现在我在这里写的内容是否足以防止攻击,或者我需要添加更多内容?

任何建议都会有很大帮助。

这是我的代码

索引.php

<?php
        session_start();
        include('db.php');
?>
<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>

<?php
    if(isset($_POST['login']) && $_POST['login'] == 'Login') {
        $loginEmail = $_POST['loginEmail'];
        $loginPassword = $_POST['loginPassword'];
        $query = $db->prepare("INSERT INTO dbname(password,email) VALUES ('?','?');");
        $query->bind_param("ss",$loginEmail,$loginPassword);
        $query->execute();
    }         
    ?>
        <div id="login">            
            <strong>Login</strong>
            <br/><br/>
            <form action = "<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
                <table style="width:500px">                        
                    <tr>
                        <td><input type="text" name="loginEmail" placeholder = "Email" required/><br/></td>
                    </tr>                    
                    <tr>
                        <td><input type="password"  name="loginPassword" placeholder = "Password" required/><br/></td>
                    </tr>
                </table>
                <input style="font-weight: bold; width: 70px; height: 25px; border-radius: 5px;" type="submit" name="login" value="Login"/>
            </form>
        </div>       
</body>    
</html>

数据库.php

<?php
        $host = 'host';
        $user = 'user';
        $password = 'password';
        $database = 'dbname';
        $db = new mysqli($host, $user, $password, $database);
        if($db->connect_errno > 0){
            die('Unable to connect to database ['.$db->connect_errno.']');
        }
?>

使用

$db->prepare("INSERT INTO users(password,email) VALUES (?, ?);");

而不是

$db->prepare("INSERT INTO users(password,email) VALUES ('?','?');");

顺序很重要:在您的bind_param()中,您的电子邮件和密码顺序与查询中的顺序相反。

删除 INSERT 查询中的引号。

$query = $db->prepare("INSERT INTO dbname(password,email) VALUES (?,?);");

另外,我建议您使用stripslahes()和trim()之类的函数

用:

$loginEmail    = trim (stripslashes( $_POST['loginEmail'] ));
$loginPassword = stripslashes( $_POST['loginPassword'] );