【问题标题】:Multiple array results in a variable多个数组产生一个变量
【发布时间】:2013-05-14 19:18:35
【问题描述】:

我有一些 PHP 代码:

$categories = mysql_query("SELECT category_id, category_name AS categories FROM categories");

while ($row = mysql_fetch_assoc($categories)){
        $columnvalues[] = $row['categories'];
}

$catlist = $columnvalues[0];

$catchq = mysql_query("SELECT message AS message FROM box WHERE LOWER(message) LIKE '".$catlist."'");
$catchr = mysql_fetch_array($catchq);
$catchx = $catchr['message'];
echo $catchx."\n";

上面的代码按预期工作,但仅适用于 [0] 匹配并且消息包含 [0] 的类别名称。我想要完成的是让第二个查询查找在第一个查询中找到的四个类别中的任何一个。

我如何将它与 [1]、[2]、[3] 匹配?我尝试了 OR 运算符,但它并没有像我想象的那样工作(例如$catlist = $columnvalues[0] or $columnvalues[1];

【问题讨论】:

  • 不要使用 MySQL 函数,而是使用 MySQLi
  • @savafa 为什么?我的意思是,我知道为什么,但只是这么说而不解释为什么并没有多大用处。此外,这并不重要——他不会将任何用户提供的数据放入查询中,因此不存在注入风险。
  • @sgroves,真的不全是因为注入风险,MySQL 已弃用,不再支持,迟早会被删除。
  • 首先应该说 :P 顺便说一句 mysqli 也很烂;没有理由不只使用 pdo,除非性能差异在您的应用程序中很重要(在这种情况下......为什么要使用 php?)

标签: php mysql arrays variables


【解决方案1】:

你可以直接遍历$columnvalues:

$query = "SELECT message AS message FROM box WHERE LOWER(message)"
foreach ($columnvalues as $key => $value) {
    if ($key) {
        $query .= " OR ";
    }
    $query .= " LIKE '%$value%' ";
}
$catchq = mysql_query($query);

您的代码容易被注入。您应该对 PDO 或 mysqli 使用正确参数化的查询。

【讨论】:

  • @sgroves 任何使用连接的查询都是易受攻击的,所以LIKE '%$value%' 是一个漏洞
  • 真的吗?作为恶意用户,您将如何利用这个“漏洞”? 'select * from ' . 'potatoes' 也是一个使用连接的查询。它容易受到攻击吗?
  • @sgroves 我的意思是变量的串联;也许我应该说插值
  • 我的观点仍然成立。只有当被连接的变量可能包含用户输入时,连接变量才是一个漏洞。在有问题的代码中情况并非如此。
  • @sgroves 你怎么知道categories 表的内容不包含用户输入?
【解决方案2】:

首先使用 MySQLi,因为 MySQL 已被弃用。 这可以做你想做的事:

$mysqli = new mysqli($dbhost, $dbuname, $dbpass, $dbname);
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
$categories = $mysqli->query("SELECT `category_id`, `category_name` AS `categories` FROM `categories`");

while ($row = $categories->fetch_array(MYSQLI_BOTH)){
        $columnvalues[] = $row['categories'];
}

$stmt = $mysqli->prepare("SELECT `message` FROM `box` WHERE LOWER(`message`) LIKE ?"); 
foreach($columnvalues as $value){
        $stmt->bind_param("s", $value);
        $stmt->execute();
        $stmt->bind_result($message);
        $stmt->fetch();
        printf("%s: %s<br>", $value, $message);
}
$stmt->close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2021-02-20
    • 2018-08-29
    • 2016-05-23
    相关资源
    最近更新 更多