【问题标题】:mysql WHERE IN array string / usernamemysql WHERE IN 数组字符串/用户名
【发布时间】:2011-09-30 20:24:30
【问题描述】:

代码:

$friendsArray = array("zac1987", "peter", "micellelimmeizheng1152013142");
$friendsArray2 = join(', ',$friendsArray);  
$query120 = "SELECT picturemedium FROM users WHERE username IN ('$friendsArray2')";
echo $query120;

这是输出:

SELECT picturemedium FROM users WHERE username IN ('zac1987, peter, micellelimmeizheng1152013142')

失败是因为用户名没有用单引号括起来,例如“zac1987”、“peter”、“mice...”。每个用户名如何用单引号括起来?

【问题讨论】:

  • 考虑在此问题中添加 Perl 或 PHP 标记以覆盖更多受众。

标签: php mysql arrays


【解决方案1】:

让我们一个接一个地遍历每个名​​称,然后逐个转义。

我将建议您使用实际的 MySQL 转义函数而不是仅仅用引号括起来,以确保数据实际上正确地进入查询。 (否则,如果我输入像It's me! 这样的名称,单引号会弄乱查询。)我将假设您使用的是PDO(您应该这样做!),但是,如果不是,用mysql_real_escape_string 替换对PDO::quote 的引用。

foreach($friendsArray as $key => $friend) {
  $friendsArray[$key] = PDO::quote($friend);
}

$friendsArray2 = join(', ', $friendsArray);

【讨论】:

  • 我测试了mysql_real_escape_string,输出还是和'zac1987,peter,micellelimmeizheng1152013142'一样
  • 是的,这里应该是这样。你需要的是$friendsArray[$key] = "'".mysql_real_escape_string($friend)."'";
  • @Michael:笨蛋。自从我使用标准 MySQL 函数以来已经有一段时间了 xD 感谢您的关注:)
【解决方案2】:

在 Google 上找到了这个问题,并通过这样做找到了解决方案。不确定这个解决方案有多“合适”,但它对我有用。

    $friendsArray = array("zac1987", "peter", "micellelimmeizheng1152013142");
    $friendsArray2 = "'" . join(', ',$friendsArray) . "'";  
    $query120 = "SELECT picturemedium FROM users WHERE username IN ($friendsArray2)";
    echo $query120;

【讨论】:

  • 它也有上面提到的同样的问题。检查 Matchu 的答案以获得真正的解决方案。
  • 这个好像中间有个不加单引号。我相信杰里米的意思是: $friendsArray2 = "'" 。加入("', '",$friendsArray) 。 "'";
  • 中间单引号缺失(如果是数字),应该是$friendsArray2 = "'" . join("', '",$friendsArray) . "'";
【解决方案3】:

如果你只有数字,一切都很容易。但是如果你有字符串,你需要检查引号并小心。如果你不想使用 PDO 或“mysql_real_escape_string”,下面的代码是可以的。我测试过,效果很好。

$friendsArray = array("zac1987", "peter", "micellelimmeizheng1152013142");
$friendsArray2 = '"' . implode('","', $friendsArray) . '"';
$query120 = "SELECT picturemedium FROM users WHERE username IN ($friendsArray2)";
echo $query120;

【讨论】:

    【解决方案4】:

    只需要做一些非常相似的事情。这是一种非常简单的方法,我在头疼之后才发现。

    $friendsArray = array("zac1987", "peter", "micellelimmeizheng1152013142");
    $friendsArray2 = implode("','",$friendsArray); 
    

    这将在数组中的每个元素之间添加引号,但不会在开头或结尾添加引号因此: $friendsArray2 = "zac1987','peter','micellelimmeizheng1152013142" 所以现在你所缺少的只是 zac1987 中 z 之前和 3142 之后的最后一个单引号 要解决这个问题,只需在 SELECT 语句中将 $friendsArray2 用单引号括起来。

    它已经过尝试、测试并且是真实的。

    $query120 = "SELECT picturemedium FROM users WHERE username IN ('$friendsArray2')";
    echo $query120;
    

    输出: SELECT picturemedium FROM users WHERE username IN ('zac1987', 'peter', 'micellelimmeizheng1152013142')

    【讨论】:

      【解决方案5】:

      如果您不想使用 PDO 或其他复杂的解决方案,请使用 implode 函数,一切就绪。

      $friendsArray  = array("zac1987", "peter", "micellelimmeizheng1152013142");
      $friendsArray2 = "'" .implode("','", $friendsArray  ) . "'"; 
      $query120      = "SELECT picturemedium FROM users WHERE username IN ( $friendsArray2 )";
      echo $query120;
      

      解决方案:我刚刚通过',' 将你的$friendArray 内爆了,就是这样。干净利落!它正在工作。

      输出SELECT picturemedium FROM users WHERE username IN ('zac1987','peter','micellelimmeizheng1152013142')

      【讨论】:

      • 非常简单的解决方案,对我来说非常及时,谢谢
      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2014-05-09
      • 2011-04-06
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多