【问题标题】:mysql for PHP only working for somemysql for PHP 仅适用于某些人
【发布时间】:2015-12-13 17:02:49
【问题描述】:

我创建了一个网站,使用 PHP 和 HTML,它涉及将数据提交到 SQL 数据库,但它只是将数据添加到数据库中,仅供某些人使用。它为谁工作和不为谁工作是完全随机的。

SQL 服务器与网站托管在同一台服务器上,我已在 phpmyadmin 中检查了我的 SQL 代码以确保其正常工作。

数据提交到SQL服务器的PHP代码如下:-

<?php
#CHANGING POST VARS TO REG VARS
$submit = $_POST['Submit'];
$ign = strtolower($_POST['ign']);
$name = $_POST['rname'];
$email = $_POST['email'];
$age = $_POST['age'];
$reason = $_POST['reason'];
$duration = $_POST['duration'];
$date = date('Y-m-d');

if (isset($_POST['past_yes'])){
    $pe = "1";
}else{
    $pe = "0";
}

if ($ign !== "" and $name !== "" and $email !== "" and $age !== "" and $reason !== "" and $duration !== "" and isset($_POST['Submit'])){
    $conn = mysql_connect("localhost", "wadmin", "CENSORED", "DibDibCraft-API");
    $data = "INSERT INTO `custom_staffapp`
    (`ign`,`name`,`email`,`age`,`reason`,`past`,`duration`,`date`)
    VALUES('$ign','$name','$email','$age','$reason','$pe','$duration', '$date')";
    mysql_query($conn, $data);
    mysql_close($conn);
    sleep(0.5);
    $ign = "";
    $name = "";
    $email = "";
    $age = "";
    $reason = "";
    $duration = "";
    $pe = "";
    header("Location: http://www.dibdibcraft.com/staff/apply_done");
}else $error = true;
?>

填写代码,包括 HTML 可以在这里找到:http://pastebin.com/vn8HReRG

我不知道这是否是我的代码中的错误,因为我使用的 PHP 检查器说没有问题,或者这是否是我正在使用的服务器的问题。

我已经尝试了mysqli_query(),以及我使用过的所有mysql 函数的等效mysqli,但同样的问题仍然存在。

服务器详情

操作系统:Ubuntu 服务器 15.04

内存:4GB

端口:全部开放

网络服务器:Apache2

LAMP:与 MYSQL 客户端一起安装

请让我知道您提出的任何建议,无论我是否需要服务器上的新软件或其他什么。 PS:与网站有关的所有文件都有 775 权限(因此每个人都可以阅读和执行它们),如果有帮助的话。

在此先感谢您的帮助,Aaron :)

顺便说一句:这不是重复的,因为这里没有这样的问题,如果有,也没有回答。

【问题讨论】:

  • 这是个骗子。您没有使用参数化查询,并且遇到了破坏您的 sql 的引用问题,除了是一个主要的安全问题。
  • 抱歉听起来像个菜鸟,但我该如何解决?
  • 你能提供一个重现问题的例子吗?我怀疑这是因为您直接在 sql 中使用用户提供的数据。为了。例如如果有人会在你的原因 textarea 中使用双引号,那么这会破坏你的 sql。使用 mysql_real_escape_string() 来防止此类问题(准备好的语句更好)。
  • 首先,编辑您的问题以删除您的域名。就像,现在。
  • 然后阅读这个并使用那个 api。 php.net/manual/en/mysqli.quickstart.prepared-statements.php

标签: php mysql sql-server mysqli


【解决方案1】:

考虑到问题是由于用户输入单引号和双引号而导致的代码破坏。 我会提出以下快速解决方案。在保存到数据库之前过滤所有输入。

在文件开头添加以下内容

function filter(&$array) {
$clean = array();
foreach($array as $key => &$value ) {
    if( is_array($value) ) {
        filter($value);
    } else {
        $value = trim(strip_tags($value));
        if (get_magic_quotes_gpc()) {
            $data = stripslashes($value);
        }
        $data = mysql_real_escape_string($value);
    }
 }
}

filter($_POST); # filters $_POST and any nested arrays by reference

上述函数将递归过滤所有元素并清理它们以连接到INSERT INTO sql 语句。并且您的脚本在保存到数据库时不应该行为不端。

【讨论】:

  • 那么你如何从数据库中读取数据,因为当我来读取数据时,它不会显示任何内容......
  • 答案已更新... 如果问题是输入清理,该用法有望使所有插入数据库成功。从数据库读取是另一项任务。
  • kk,谢谢。我会投票给你,但我是新用户,所以我不能。苏兹。
【解决方案2】:

我以一种非常简单的方式解决了它。这可能不是最好的方法,但它是单行的(对于每个变量),它在我的情况下非常有效!

像这样向数据库中插入变量,而不是插入变量; $reason = $_POST['reason'];

我在 PHP 中使用过 addslashes()stripslashes() 函数。
因此,当向数据库提交数据时,您可以执行以下操作;

$reason = "My name is 'aaron'";
$reason = addslashes($_POST['reason']);
echo($reason);

这会返回;

我的名字是\'aaron\'

然后,要删除斜线,您可以使用 stripslashes() 函数:-

$reason = stripslashes($reason);
echo($reason);

这会返回;

我叫亚伦

感谢所有回答的人,但这似乎是解决此问题的最佳、最简单和最快的方法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2023-03-17
    • 1970-01-01
    • 2011-07-04
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多