【问题标题】:PHP, SQL, in_array with csv and while loop only retrieving integerPHP,SQL,in_array 与 csv 和 while 循环仅检索整数
【发布时间】:2012-01-07 04:57:25
【问题描述】:

我搜索了类似的问题,但找不到针对我的特定问题的正确答案。我的表(表)中有一个列(数据),其中包含逗号分隔的值,这些值是 id,例如

  • 第 1 行 = 4,5,45
  • 第 2 行 = 5,8,9
  • 第 3 行 = 5

我使用 in_array 函数来检索 while 循环中 $data 值的出现次数。因此,我使用 sql 函数来检索某个值(例如“5”)在 while 循环内的所有行中出现的次数。

问题是我只能检索 $data 值,如果它本身(即没有逗号,只有整数本身)所以根据我在列表中的示例,我只能检索 5 一次(第 3 行) .我想检索值“5”三次,因为它出现在所有行中。下面是我的代码,任何帮助将不胜感激。 $selectiontext 变量是用户从表单中输入的内容。

 $sql_frnd_arry_mem1 = mysql_query("SELECT data, id FROM table WHERE    data='$selectiontext'");

while($row=mysql_fetch_array($sql_frnd_arry_mem1)) { 

$datacheck = $row["data"]; 
$id = $row["id"]; 

}

$frndArryMem1 = explode(",", $frnd_arry_mem1);
if  (($frnd_arry_mem1 !=="") && (!in_array($id, $frndArryMem1))) {echo $id;}

谢谢。

【问题讨论】:

  • $frndArryMem1$frnd_arry_mem1 来自哪里?
  • 嗨 davogotland,变量 $frndArryMem1 是展开函数,$frnd_arry_mem1 是设置为保存 csv 数组并将 $id 变量重新插入字段的空变量。所以 $frnd_arry_mem1 = "$frnd_arry_mem1,$id"
  • 这个问题已经被回答了很多次了......第一个答案是你应该首先正确地标准化你的数据,然后这个问题就不会存在了
  • 谢谢马克,我对数据库管理很陌生,所以我不知道这种方法是否是最有效的方法。但我会看看标准化。再次感谢

标签: php sql csv


【解决方案1】:

您不断地覆盖变量$datacheck$id,只剩下最后一个版本。将花括号向下移动两行,如下所示:

$sql_frnd_arry_mem1 = mysql_query("SELECT data, id FROM table WHERE    data='$selectiontext'");

while($row=mysql_fetch_array($sql_frnd_arry_mem1)) { 

    $datacheck = $row["data"]; 
    $id = $row["id"]; 


    $frndArryMem1 = explode(",", $frnd_arry_mem1);
    if  (($frnd_arry_mem1 !=="") && (!in_array($id, $frndArryMem1))) {echo $id;}
}

【讨论】:

  • 嗨 davogotland,我已经尝试了你的方法,但仍然只收到 $id 本身而不是在数组中。或者,我可以通过修改 sql 语句以使用诸如 SELECT data、id FROM table WHERE data='$selectiontext' AND $id like '%newid%'") 之类的方式从数组中检索 $id;$newid 变量是$newid=£id.','; 包括逗号。我不确定这是否是最佳做法,但它确实会返回所有出现的情况。
【解决方案2】:

我不完全确定您的要求,也不是很清楚您打算做什么,因为缺少部分代码。 我假设您想检查 CSV 文件($frnd_arry_mem1 是行)中逗号分隔的每一行与列数据中的数据,如果出现任何逗号分隔数据(不)。 假设您已经在循环浏览您的 CSV,这将是代码(未经测试):

注意:在循环中检索数据可能效率低下,如果你可以这样做 - 但我不能说,因为我不知道你的脚本的完整规范。

如果我的规格有误,请澄清,我会尽力提供进一步帮助。

$sql = "SELECT data, id
        FROM table
        WHERE data='$selectiontext'";
$sql_frnd_arry_mem1 = mysql_query($sql);
$results = array();
// get values to check
while ($row = mysql_fetch_array($sql_frnd_arry_mem1))
{
  $results[] = array(
                 'datacheck' => $row["data"],
                 'id' => $row["id"],
               ); 
}

foreach ($results as $result)
{
   $frndArryMem1 = explode(",", $frnd_arry_mem1);
   $data = explode(',', $result['datacheck']);
   foreach ($data as $d)
   {
     if  (($frnd_arry_mem1 !=="") && (!in_array($d, $frndArryMem1)))
     {
       echo 'DEBUG: Record #' . $id . ' not found, value:' . $d . '</br>';
     }
   }
}

【讨论】:

  • 嗨 Uboonto,我已经尝试了您的解决方案,发现它仍然只检索单个 $id,而不是 csv 中的值。 csv 只是 $data 列中的一串 id 数字。我的目标是提取循环内每一行中出现的特定 $id 编号。目前我只能检索没有逗号分隔的iteslf 的$id。我认为解决方案是将表标准化,因为值 $id 和 $data 包含多对多关系。但是非常感谢您的帮助
猜你喜欢
  • 2016-12-28
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2015-05-11
  • 2017-10-09
  • 2016-01-21
相关资源
最近更新 更多