无法在_array()中为PHP获取正确格式的数据库数据


Unable to fetch db data in proper format for PHP in_array()

我已经尝试了所有可以想象的方法,但当我根据db值动态创建数组时,我似乎无法正确格式化它以使用in_array()。我认为问题只是需要将每个值都用引号括起来,因为只要它是这样格式化的,我就可以将in_array()与硬编码数组一起使用,但我无法使用explodeimplode添加引号。

我正在尝试做的事情:这是我正在尝试的一个非常简单的例子,即根据产品与客户偏好列表的匹配程度来过滤查询结果(没有注射风险,我尝试过使用和不使用PDO)。

我知道有几个非常相似的帖子,但在花了比我愿意承认的更多的时间试图实现我看到的每一个教程和帖子之后,我决定是时候向社区寻求帮助了

in_array()语句

  $Color='Black';
  if (in_array($Color, $colors_love_Arrays)) {
    echo "Matches: ", $Color;
}

查询形成阵列的信息

$colors_love_Array = array(); 
$result = mysql_query("SELECT * FROM style WHERE style.user_id = $user_id") or die(mysql_error());    
while ($row_profile = mysql_fetch_array($result)) {    
// I've tried both of these, both separately and together
$colors_love_Array[] = $row_profile['colors_love'];    
$colors_love_Array = explode('",', $row_profile['colors_love']);  

}

我需要如何构建阵列

$colors_love_Array = array('Black','Charcoal','Light_Gray','White','Royal_Blue','Dodger_Blue','Red'); 

var_dump ($colors_love_Array);的结果是:

array(1) { [0]=> string(59) "Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red " } 

作为in_array的文档状态:

in_array—检查数组中是否存在值

但是var_dump清楚地告诉您想要的嵌套值是一个字符串。

array(1) { [0]=> string(59) trim("Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red ") }
                 ^^^^^^

一种可能的方法是使用strpos而不是in_array

$Color='Black';
  if (strpos($Color, $colors_love_Arrays[0]) !== false) {
    echo "Matches: ", $Color;

然而,如果你有WeirdBlack这样的颜色,它就会匹配。

事实上:

$Color='Black';
  if (strpos($Color, "WeirdBlack") !== false) {
    echo "Matches: ", $Color;

输出

Matches: WeirdBlack;

或者,您希望使用preg_match:

$Color='Black';
  if (preg_match('/(?:^|,)('.$Color.')(?:,|$)/', "Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red ") !== false)
    echo "Matches: ", $Color;

使用的正则表达式是'/(?:^|,)('.$Color.')(?:,|$)/':

演示


您可能需要获取一个数组。然后使用爆炸:

$arr = explode(',', trim($colors_love_Array[0]));

然后像这样使用:

$Color='Black';
  if (in_array($Color, $arr)) {
    echo "Matches: ", $Color;
}

或者再次使用preg_match

$Color = 'Black';
$arr = explode(',', trim("Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red "));
   if (preg_grep('/('.$Color.')/', $arr))
        echo 'match';

检查一下,我认为它应该适用于

$colors_love_Array=Array()
$result=mysql_query("SELECT*FROM style WHERE style.user_id=$user_id")或die(mysql_error());

while($row_profile=mysql_fetch_array($result)){
//这两种我都试过了,分别试过,也一起试过
$colors_love_Array[]=$row_profile['colors_love']
}

$newColorsArray=爆炸(",",内爆($colors_love_Array));

if(in_array($Color,$newColorsArray)){
echo"匹配:"$颜色
}

您的结果不应该是一个数组,而不是用逗号分隔的字符串吗?

无论如何,您的结果为var_dumped。

$parts = explode( ',', trim( $colors_love_Array ) );
if( in_array( 'Black', $parts ) )
    echo "is here'n";

但我想你真的想得到这个:

"Black,Charcoal,Light_Gray,White,Royal_Blue,Dodger_Blue,Red"

作为一个数组。由于我不知道你的DB中有什么,我无法在这方面提供建议。

您的方法有点错误。代码将所有颜色存储为字符串,尽管您将它们作为数组接收。因此,您需要使用strpos在字符串中搜索另一个字符串的特定出现,即该字符串是否在任何位置都包含Black。如果以后你需要能够以特定的方式对颜色进行排序,那么使用这种方法会让你的生活变得更加艰难。

正如@Adam Sinclair所建议的,因为数据是以string的形式包含的,所以可以使用preg_match来检查字符串是否包含颜色。不幸的是,preg_match是一个相当昂贵的函数,应该明智地使用,并作为最后的手段。

此外,我建议您使用PDO和准备好的语句来连接数据库——您不希望SQL注入,对吧?

在我看来,实现任务的更好方法是使用类似于下面的代码:

<?php    
// Host
$hostname = 'localhost';
// Database
$database = 'database';
// Username
$username = 'user';
// Password
$password = 'pass';
// Connection DSN.
// http://php.net/manual/en/ref.pdo-mysql.connection.php
$dsn = 'mysql:host='.$hostname.';dbname='.$database;
try {
    // Create a database connection using PDO
    $db = new PDO($dsn, $username, $password);
    // The value of the user_id (i.e. $_SESSION['user_id'])
    $user_id = 1301;
    // Get all colors, liked by a specific user.
    $query = $db->prepare('SELECT * FROM style WHERE style.user_id = :user_id');
    // Bind the value of $user_id to :user_id in the query.
    $query->bindValue(':user_id', $user_id);
    // Execute the query
    $query->execute();
    // Gets all results for a specific database column (i.e. 'color_loves').
    // In my table, I had color_id, user_id, color_loves, therefore the desired index is 2.
    // NOTE: Remember array indexes start counting from 0.
    $colors = $query->fetchAll(PDO::FETCH_COLUMN, 2);
    // The output of the above will be something similar to this:
    // array(5) { [0]=> string(5) "Black" [1]=> string(8) "Charcoal" [2]=> string(10) "Light_Gray" [3]=> string(5) "White" [4]=> string(10) "Royal_Blue" }
    $color='Black';
    if (in_array($color, $colors)) {
        echo "Matches: ", $color;
    }
    // Outputs Matches: Black
    // Disconnect from the database.
    $db = null;
}
catch(PDOException $e)
{
    // Output any exception messages that might occur
    echo $e->getMessage();
}
?>

正如你所看到的,它简单、干净、安全且可扩展。不需要难读的正则表达式,从数组分解/内爆字符串等等。如果将来你的任务发生了变化,需要对颜色进行排序,你可以通过阅读手册轻松做到这一点。