【问题标题】:PHP, Inserting Form Data Into MYSQLiPHP,将表单数据插入 MYSQLi
【发布时间】:2019-03-17 23:49:42
【问题描述】:

我在创建此登录系统时遇到问题。当有人登录时,我希望它创建一个表,如果还没有的话。然后将它们带到表单页面,然后插入数据。在最后一页插入之前,我一切正常。

Steam API 登录后

<?php
    session_start();
    require ('../../../mysql_connect/mysqli_connect_accounts.php');
    require ('../steamauth/steamauth.php');
    require ('../steamauth/userInfo.php');
    $steamid=$_SESSION['steamid'];
    
    $query = "SELECT * FROM `".$steamid."`";
    
    $response = @mysqli_query($dbc, $query);
    
if($response){
        header("Location: http://theskindealer.com/index.php");
    } else {    
        $create = "CREATE TABLE `".$steamid."` (
        steam64 VARCHAR(30), 
        fullname VARCHAR(60),
        tradeurl VARCHAR(60),
        email VARCHAR(50),
        age INT(3),
        tos INT(1),
        access INT(1),
        freeze INT(1),
        balance DECIMAL(9,2),
        newsletter INT(1),
        emailVerified INT(1)
        )";
        if ($dbc->query($create) === TRUE) {
        
            header("Location: http://theskindealer.com/scripts/createAccount.php");

        } else {
            header("Location: http://theskindealer.com/pages/errorlogin.php");
        }
}
$stmt->close();
$dbc->close();
    
?>

然后它重定向到表单页面:

<!DOCTYPE HTML>

<?php
session_start();
require ('../../../mysql_connect/mysqli_connect_accounts.php');
require ('../steamauth/steamauth.php');
require ('../steamauth/userInfo.php');
$steamid=$_SESSION['steamid'];
?>

<html>
<head>
<title>TheSkinDealer | Setup</title>
<link rel="stylesheet" type="text/css" href="../css/accept.css"></head><body>
<div id="content">
<div id="acceptbox">
<img src="../images/logo.png">
<form action="setup.php" method="post">
        
<div id="name1">Full Name:</br> <input type="text" name="fullname"> </br></div>
<div id="name1">TradeURL: <a target="_blank" href="http://steamcommunity.com/id/me/tradeoffers/privacy#trade_offer_access_url">(?)</a></div> <input type="text" name="tradeurl"> </br>
<div id="name1">EMAIL:</div> <input type="text" name="email"> </br>
<div id="checkboxes">
<a href="http://theskindealer.com/tos/tos.php" target="_blank">Terms Of Serice</a>:  <input type="checkbox" name="tos" value="1"> </br>
18 Or Older:  <input type="checkbox" name="age" value="1"></br>
Newsletter:  <input type="checkbox" name="newsletter" value="1"></br>
</div>
<div id="returnhome">
<div id="accept"><input type="submit" value="Create Account"></a></div>
</div>
</form>
</div>
<center><div id="par">Purchases Or Sales Cannot Be Made Without Accepting TOS.</div></center>
</div>
</body>
</html>

最后是插入页面:

<?php
    session_start();
    require ('../../../mysql_connect/mysqli_connect_accounts.php');
    require ('../steamauth/steamauth.php');
    require ('../steamauth/userInfo.php');
    $steamid=$_SESSION['steamid'];
        
            $insert = "INSERT INTO `".$steamid."` (steam64, freeze, access, 
tos, balance, age, email, tradeurl, fullname, newsletter, emailVerified) 
                       VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            $stmt = $dbc->prepare($insert);
            $stmt->bind_param('sssssssssss', 
                $steam64, 
                $freeze, 
                $access, 
                $tos, 
                $balance, 
                $age, 
                $email, 
                $tradeurl, 
                $fullname,
                $newsletter,
                $emailVerified
            );
            
            $steam64 = $steamid;
            $freeze = 0;
            $access = 0;
            $tos = $_POST["tos"];
            $balance = 0.00;
            $age = $_POST["age"];
            $email = $_POST["email"];
            $tradeurl = $_POST["tradeurl"];
            $fullname = $_POST["fullname"];
            $newsletter = $_POST["newsletter"];
            $emailVerified = 0;
            $stmt->execute();
        
            header("Location: http://theskindealer.com/");
$stmt->close();
$dbc->close();
    
?>

【问题讨论】:

  • 您是否遇到错误?您应该在您的插入和发布错误语句中设置错误报告。
  • 您是否正在为该系统上的每个用户创建一个新的数据库表?这看起来是可扩展的吗?
  • 考虑使用VARCHAR(255) 作为默认的通用字符串类型字段,并且只有在您有令人信服的理由时才覆盖它。许多 MySQL 安装会默默地截断任何不适合的数据,从而导致数据丢失、用户投诉和其他严重问题。姓名和电子邮件地址经常出人意料地长,因此适应这些很重要。
  • 警告:使用抑制错误的 YOLO 运算符 (@) 会掩盖代码中的问题,并使此类调试问题变得更加复杂。这是不得已而为之的工具,只能在特殊情况下使用。您应该为用户显示错误消息、记录问题、启动某种重试,或者将所有这些事情结合起来。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。

标签: php html mysql forms mysqli


【解决方案1】:

执行此脚本时是否遇到任何错误? 例如,您可以在脚本顶部添加 error_reporting(E_ALL); 以更好地查看错误。

查看脚本,您似乎在变量存在之前就对其进行了绑定。 您应该将变量分配放在bind_param 执行之前:

    $steam64 = $steamid;
    $freeze = 0;
    $access = 0;
    $tos = $_POST["tos"];
    $balance = 0.00;
    $age = $_POST["age"];
    $email = $_POST["email"];
    $tradeurl = $_POST["tradeurl"];
    $fullname = $_POST["fullname"];
    $newsletter = $_POST["newsletter"];
    $emailVerified = 0;



   $stmt->bind_param('sssssssssss', 
        $steam64, 
        $freeze, 
        $access, 
        $tos, 
        $balance, 
        $age, 
        $email, 
        $tradeurl, 
        $fullname,
        $newsletter,
        $emailVerified
    );

    $stmt->execute();

另外请记住,像 0 这样的数值必须与 'i' 而不是 's' 绑定 请参阅http://php.net/manual/de/mysqli-stmt.bind-param.php 了解更多信息。

例如。

   $stmt->bind_param('iiisdissssi',

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2013-08-24
    • 2017-05-18
    • 2013-05-26
    • 2016-08-26
    • 2015-02-27
    相关资源
    最近更新 更多