【问题标题】:mysqli_query inputs via variablemysqli_query 通过变量输入
【发布时间】:2013-03-16 14:14:09
【问题描述】:

我正在尝试使用以下 PHP 代码向 MySQL 表添加信息。 (从 HTML5 基本 Web 表单中输入名称和文本。)可能是语法问题?

<?php
include "dbinfo.php"; //contains mysqli_connect information (the $mysqli variable)
//inputs
$name = $_GET["name"];
$text = $_GET["text"];

$sqlqr = 'INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ("$name", "$text", CURRENT_TIMESTAMP);'; //the query. I'm pretty sure that the problem is a syntax one, and is here somewhere.

mysqli_query($mysqli,$sqlqr); //function where the magic happens.
?>

没有抛出错误。结果是一个空白屏幕,并且将带有“$name”和“$text”的行添加到 MySQL 表中。

【问题讨论】:

  • 警告!您的代码很容易受到 SQL 注入攻击。阅读有关如何转义 SQL 变量的信息,最好使用准备好的语句。
  • 根据发布的代码,插入的行和空白屏幕正是我所期望的。
  • mysqli_error() 返回什么?
  • @EdGibbs 是的,但是添加的是变量名(字面意思是 $name),而不是它的值。
  • @Jocelyn mysqli_error() 不返回任何内容(假设我使用正确)。

标签: php mysql phpmyadmin mysqli


【解决方案1】:

您的代码应该是这样的(添加了 SQL 注入保护):

<?php
include "dbinfo.php"; //contains mysqli_connect information (the $mysqli variable)
//inputs
$name = mysqli_real_escape_string($_GET['name']);
$text = mysqli_real_escape_string($_GET['text']);

$sqlqr = "INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ('" . $name . "', '" . $text . "', CURRENT_TIMESTAMP);";

mysqli_query($mysqli,$sqlqr); //function where the magic happens.
?>

看看我做了什么。首先,我已将您正在检索的用户输入转义到 $name$text 变量中(出于安全原因,这几乎是必须的),并且正如其他人建议的那样,您最好使用准备好的语句。

问题是您没有用单引号 (') 包围字符串值,这是 SQL 语法的要求。

我希望这有助于回答您的问题。

【讨论】:

  • 谢谢。这似乎给出了一些错误(在 $sqlqr 行和输入中),但我很确定我知道那里发生了什么并将修复它。
  • @EM-Creations 你需要修正单引号和双引号。
  • 程序 mysqli_real_escape_string() 有两个参数:要转义的字符串和 $link 变量。 php.net/manual/en/mysqli.real-escape-string.php
  • 如果我使用 VALUES ('$name ', ' $text ', CURRENT_TIMESTAMP) 而不是 VALUES ('" . $name . "', '" . $text . "' , CURRENT_TIMESTAMP) ?如果是,那你能解释一下原因吗?
【解决方案2】:

首先:你应该使用mysqli准备好的语句来防止SQL注入攻击。 在没有适当转义的情况下在查询中使用用户输入是不安全的。准备好的语句有助于防止这种情况发生。

第二:你应该了解字符串引用在PHP中是如何工作的,单引号字符串和双引号字符串是不同的

我建议阅读PHP documentation 关于字符串引用。

【讨论】:

  • 将查看并阅读它。我以为我已经读得够透彻了,但我想我需要再看一遍。
【解决方案3】:
   $sqlqr = 'INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ("'.$name.'", "'.$text.'", CURRENT_TIMESTAMP)';

将变量放在引号之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2023-01-27
    • 2018-05-13
    相关资源
    最近更新 更多