通过 PHP 将值插入 SQL [关闭]

Posted

技术标签:

【中文标题】通过 PHP 将值插入 SQL [关闭]【英文标题】:Inserting values into SQL by PHP [closed] 【发布时间】:2018-12-26 22:57:01 【问题描述】:
<?php
if (isset($_POST['submit'])) 
    //google ReCAPTCHA
    $secret = "-";
    $response = $_POST['g-recaptcha-response'];
    $remoteip = $_SERVER['REMOTE_ADDR'];
    $url = "https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$response&remoteip=$remoteip";
    $response = file_get_contents($url);
    $result = json_decode($response);

    if ($result->success) 
        define("SERVERNAME", "-");
        define("USERNAME", "-");
        define("PASSWORD", "-");
        define("DATABASE", "-");


        $connection = mysqli_connect(SERVERNAME, USERNAME, PASSWORD, DATABASE);
        if (!($connection->connect_error)) 
            $sql = "INSERT INTO `gift` (`t`, `p`, `a`, `c`, `ph`, `e`) VALUES ('$_POST['t']', '$_POST['p']', '$_POST['a']', '$_POST['c']', '$_POST['ph']', '$_POST['e']')";
            $result = $connection->query($sql);
            if ($result) 
                echo '<script>alert("OK.");</script>';
             else 
                echo '<script>alert("ERROR1.");</script>';
            
         else 
            echo '<script>alert("ERROR2.");</script>';
        
     else 
        echo '<script>alert("Verification failed.");</script>';
    

?>

我不知道为什么它不起作用。我试图 var_dump($sql) 并返回一个正确的字符串。之后我不能做 var_dump($result) 因为它什么都不返回。 我迷路了。我整天都在尝试用它做点什么,也许这就是为什么我看不出这里有什么问题。

我的主要目标是向数据库中插入一些信息。

【问题讨论】:

查看php.net/manual/en/mysqli.error.php 并阅读SQL injection and how to bind parameters。 我不喜欢你的列名。而且我没有足够的眉毛来皱眉你的 SQL 注入。 Xorifelse 我更改了列名,因为我不想在这里显示它们。如果你正在写它。 那是轻微的皱眉。如果你让你的脚本像那样打开是可以理解的,如果你使用准备好的语句则完全没有必要。 您的脚本对SQL Injection Attack 甚至if you are escaping inputs, its not safe! 都是开放的,在MYSQLI_PDO API 中使用prepared parameterized statements 【参考方案1】:

正如 cmets 所暗示的,请阅读 SQL 注入并练习使用它们。请参阅 here 和 here。也看看PDO(强烈推荐这个超过mysqli)和here for a tutorial on where to begin with PDO

下面是一个非常基础和简单的开始绑定参数以帮助防止sql注入:

$t = $_POST['t'];//Post data, you should probably validate this
$sql = $db->prepare("INSERT INTO `gift` (`t`, `p`, `a`, `c`, `ph`, `e`) 
        VALUES (:t, :p, :a, :c, :ph, :e)");// :t is your bind parameter
$sql->bindParam('t', $t);//bind t (:t) to $t

如果你不想用多行'bindParam'来填充你的代码,你可以直接将它们全部应用到execute方法中

//where [] is an array of values in the order of your column parameters 
//e.g. $_POST (Thanks Xorifelse )
$sql->execute([]);

正如其他人在 cmets 中提到的那样,还要检查您如何命名列,因为您现在可能理解它们,但是将来当您没有参与此项目时,您可能会忘记它们的含义,这将使继续发展有点困难。

这个site 提供了一些关于为什么使用正确的命名约定是好的信息(例如 useApproiateNamesSoIknowWhatThisIsInAYear)

【讨论】:

你可以忘记bindParam(),直接将值解析到$pdo-&gt;execute([':t' =&gt; $_POST['t'], etc..])数组中。 啊是的...!我将更新答案以包含此内容。谢谢 关于列名 - 我只是在这里更改了它们的名称。我用我的语言命名它们,所以你不会理解它们。 @szpanel 啊,好吧,您可能应该在您的 OP 中提到,即使我们不理解它们,如果我们不理解它们,我们仍然有谷歌翻译。将来发布寻求帮助时,请包括变量/列(或与之相关的内容)的英文版本,因为这将帮助那些试图回答您的问题的人给出更合适的答案:) 下次我会努力写的更好。我认为我需要和它一起睡觉并在早上阅读您的答案。谢谢,也许我明天会问一些事情。

以上是关于通过 PHP 将值插入 SQL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列 - 如何强制标识增加? [关闭]

无法将值 NULL 插入列“EmpId”[关闭]

即使没有错误,PHP也不会插入SQL表[关闭]

如何将值从 xml 提取到 php [关闭]

带有sql值的php echo()中的javascript [关闭]

有没有办法删除sql中的单元格[关闭]