当前位置: 首页 > 知识库问答 >
问题:

mysqli\u real\u escape\u string()功能不正常

艾凯捷
2023-03-14

我有以下PHP函数:

public function signup() {
        $mysql = mysqli_connect(HOSTNAME, USERNAME, PASSWORD, DATABASE);
        if (mysqli_connect_errno($mysql)) {
            $this->viewModel->set("pageTitle", "Signup");
            $this->viewModel->set("message", "There was an error connecting to the server.");
            return $this->viewModel;
        }
        if ($result = $mysql->query("SELECT id FROM mailinglist WHERE email='" . $this->email . "';")) {
            if ($result->num_rows == 0) {
                $mysql->query("INSERT INTO mailinglist (email) VALUES ('" . $this->email . "');");
                $this->viewModel->set("message", "Great! Thanks for signing up " . $this->email . ".");
            } else {
                $this->viewModel->set("message", "You are already signed up for updates!");
            }
        } else {
            $this->viewModel->set("message", "There was an error adding you the mailing list.");
        }
        $this->viewModel->set("pageTitle", "Signup");
        return $this->viewModel;
    }

它运行良好,并返回我想要的,但是,如果我试图使用mysqli_real_escape_string()来查询,它就不起作用。也就是下面的代码

public function signup() {
        $mysql = mysqli_connect(HOSTNAME, USERNAME, PASSWORD, DATABASE);
        if (mysqli_connect_errno($mysql)) {
            $this->viewModel->set("pageTitle", "Signup");
            $this->viewModel->set("message", "There was an error connecting to the server.");
            return $this->viewModel;
        }
        $query = $mysql->real_escape_string("SELECT id FROM mailinglist WHERE email='" . $this->email . "';");
        if ($result = $mysql->query($query)) {
            if ($result->num_rows == 0) {
                $query = $mysql->real_escape_string("INSERT INTO mailinglist (email) VALUES ('" . $this->email . "');");
                $mysql->query($query);
                $this->viewModel->set("message", "Great! Thanks for signing up " . $this->email . ".");
            } else {
                $this->viewModel->set("message", "You are already signed up for updates!");
            }
        } else {
            $this->viewModel->set("message", "There was an error adding you the mailing list.");
        }
        $this->viewModel->set("pageTitle", "Signup");
        return $this->viewModel;
    }

不起作用。连接没有问题,我尝试使用mysqli\u real\u escape\u string()而不是$mysql-

共有2个答案

尉迟明贤
2023-03-14

您必须转义数据,而不是整个查询。

public function signup() {
        $mysql = mysqli_connect(HOSTNAME, USERNAME, PASSWORD, DATABASE);
        if (mysqli_connect_errno($mysql)) {
            $this->viewModel->set("pageTitle", "Signup");
            $this->viewModel->set("message", "There was an error connecting to the server.");
            return $this->viewModel;
        }
       $query = "SELECT id FROM mailinglist WHERE email='" .$mysql->real_escape_string( $this->email ). "'"
        if ($result = $mysql->query($query)) {
            if ($result->num_rows == 0) {
               $query = "INSERT INTO mailinglist (email) VALUES ('" . $mysql->real_escape_string($this->email) . "')";
                $mysql->query($query);
                $this->viewModel->set("message", "Great! Thanks for signing up " . $this->email . ".");
            } else {
                $this->viewModel->set("message", "You are already signed up for updates!");
            }
        } else {
            $this->viewModel->set("message", "There was an error adding you the mailing list.");
        }
        $this->viewModel->set("pageTitle", "Signup");
        return $this->viewModel;
    }
越高峻
2023-03-14

不要这样做,使用准备好的语句。它们更安全、更可靠。您仍然需要清理数据以获得适当的值和跨站点脚本,列举一些您仍然会遇到的风险。逃避数据是防止SQL注入的一种方法,但这并不是充分的证据。准备好的语句告诉数据库服务器假设传入的数据是不安全的,只是接受它,而不是像串联字符串一样处理它。数据库将参数视为语句的变量,而不是语句的一部分。

以下是您如何将自己的声明更改为准备好的声明:

$stmt=$mysql->prepare("SELECT id FROM mailinglist WHERE email=?");
$stmt->bind_param('s',$this->email);
$result=$stmt->execute();
if ($result) {
    if ($result->num_rows == 0) {
        $stmt=$mysql->prepare("INSERT INTO mailinglist (email) VALUES (?)");
        $stmt->bind_param('s', $this->email);
        $stmt->execute();
        $this->viewModel->set("message", "Great! Thanks for signing up " . $this->email . ".");
     } else {
        $this->viewModel->set("message", "You are already signed up for updates!");
     }
} else {
     $this->viewModel->set("message", "There was an error adding you the mailing list.");

}
 类似资料:
  • 问题内容: 我使用mysqli将我连接到数据库的功能出现问题。我的目标是在需要连接的地方键入内容。 这是代码: 这是我在致电后尝试使用时遇到的错误: 注意:未定义的变量:第19行的C:\ xampp \ htdocs \ xampp \ loginsystem \ index.php中的mysqli 问题答案: 正如一些用户所建议的(这是最好的方法),返回mysqli实例 例:

  • 我对jQuery提交功能有一些疑问。 这里是工作环境 jQuery:1.7。2,铬(18.0.1025.168米)。 有两个问题。 第一: 我的密码是这样的 HTML jQuery 问题是它在firefox和opera中运行良好,但在chrome中运行良好。 2st: html:如上所述。 jQuery: 它在火狐、歌剧和铬合金中不起作用。它总是触发form.submit原因。 我很困惑。谁能弄清

  • 问题内容: 我知道很多人偶尔也会遇到相同的错误,但是我已经查看了所有先前的答案和我的代码,并且尝试了使用col和不使用反引号。这是我目前尝试使用的代码,但同样 该表中还有其他列,但是只有上面的我想为其余部分添加数据的列可以最初使用默认值 我一直在看这段代码很久了,现在我才发现问题,我知道这很愚蠢 问题答案: 将变量添加到SQL查询中的最防错的方法是通过 准备好的语句 添加变量。 因此,对于您运行的

  • 我试图用Java和Appium建立一个项目。事情是,我只是在学习,我被困在问题的前几行代码截图上 我正在尝试设置“所需功能”,但有一个问题表明这些功能无效。我也尝试查看文档,但无法弄清楚如何修复它。如果有人能帮忙,那将是很大的帮助。

  • 问题内容: 我正在尝试使用Java中的 Split 函数拆分字符串 它给了我结果 但是当我尝试以下代码时 它给了我 为什么Java split函数无法拆分以“ |”分隔的字符串 问题答案: String#split()方法接受a 而不接受a 。 因为 是元字符,在正则表达式中有特殊含义。 当您逃脱它时,它会起作用。 更新: 在java:OFFICIAL DOCS中处理特殊字符 。 附带说明: 在J

  • 问题内容: 我很难弄清楚这里出了什么问题: 例如, 输出。它应该输出6,因为长度看起来像这样:5-> 16-> 8-> 4-> 2-> 1 进行一些调试后,我看到正确返回了,但是递归中出了点问题。我不太确定 谢谢你的帮助。 问题答案: 在这两个块中,进行递归调用后不会返回任何值。您需要在递归调用之前先输入,例如。如果您没有明确声明,该函数将返回。 这样可以解决此问题,但是有一种方法可以使您的代码更