【问题标题】:Can i run functions after SELECT * FROM db WHERE in php?我可以在 SELECT * FROM db WHERE 在 php 之后运行函数吗?
【发布时间】:2018-11-27 10:38:28
【问题描述】:

我想在 WHERE 之后使用一个函数

这样就可以了

$sql = "SELECT * FROM Prodotti WHERE Id=10";

如果我希望 id 出现在 URL 链接中怎么办? 链接示例是这样的:https://www.try.org/product.php?signup=98 这样就不行了

$sql = "SELECT * FROM Prodotti WHERE strpos($fullUrl, signup=Id)";

【问题讨论】:

  • 研究$_GET
  • 您可以通过 $_GET['signup'] 获得注册
  • strpos 不是 mysql 函数,所以这不起作用。
  • @IslamElshobokshy 虽然这是有效的,但它对 SQL 注入开放
  • 请不要直接传值。使用准备好的语句并验证输入。

标签: php url


【解决方案1】:

您可以通过使用$_GET 超全局获得id

$id = (int) $_GET['signup']; // (int) makes sure it is an integer and no string

现在,为了使其在您的查询中起作用,您首先需要确保输入安全。 您可以使用mysqli_real_escape_string 使输入安全,但由于您需要一个整数而不是字符串,因此最好使用prepared statement

在你的查询中你可以做的比做

$sql = "SELECT * FROM `Prodotti` WHERE `Id` = $id";

在表名和列名周围使用反引号,以防止 mysql 保留字错误。

准备好的语句示例:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$id = (int) $_GET['signup']; 
if ($stmt = $mysqli->prepare("SELECT * FROM `Prodotti` WHERE `Id` = ?")) {

    /* bind parameters for markers */
    $stmt->bind_param("i", $id);// i for integer s for string

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    // Do something with the fetched data

    /* close statement */
    $stmt->close();
}

【讨论】:

  • 这是一个糟糕的安全建议,提示在函数名mysqli_real_escape_**string**中。
  • @Script47 据说最好使用准备好的语句
  • 但是你为什么一开始会建议不正确的代码呢?
  • @Script47 对于此示例可能不正确,但最好知道 OP 通常可以保护用户输入。知道不同方法的存在也很好
  • 知道不同的方法当然好,但当它们使用不正确时就不行了,此外,使用准备好的语句进行转义是没有意义的。
【解决方案2】:

您可以像这样从 url 获取注册参数:

$signup = $_GET['signup'];

然后在您的查询中使用它:

$sql = "SELECT * FROM Prodotti WHERE Id = '$signup'";

但这并不安全,我建议你也google一下“php mysqlprepared statements”

【讨论】:

  • 为什么不直接推荐首选方式而不是展示糟糕的代码示例?
  • 虽然此解决方案有效,但它对 SQL 注入极为不利。考虑修改此示例以提供额外的安全性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2023-03-15
  • 2020-12-24
  • 2011-02-14
  • 2011-12-15
相关资源
最近更新 更多