Php 需要从mysql编译数组帮助

Php 需要从mysql编译数组帮助,php,mysql,database,arrays,Php,Mysql,Database,Arrays,这件事一直困扰着我,我想不起来了。我将使用食品类比来尝试简化我的问题 1000名公众被要求从13种鞋类中各挑选一种。然后将这些选择存储在mysql数据库中,与它们的名称相对应 e.g. billy mary etc. etc. milk....semi. .skimmed... bread...white...brown.... cheese..edam.....edam.... fruit...apple...orange... veg....potato...sp

这件事一直困扰着我,我想不起来了。我将使用食品类比来尝试简化我的问题

1000名公众被要求从13种鞋类中各挑选一种。然后将这些选择存储在mysql数据库中,与它们的名称相对应

e.g.    billy   mary   etc.   etc.

milk....semi. .skimmed...

bread...white...brown....

cheese..edam.....edam....

fruit...apple...orange...

veg....potato...sprout...

meat....beef.....beef....

sweet..bonbons..liquorice..

fish...trout....salmon...

crisp....s&v....plain....

biscuit..hovis..rich tea..

wine.....red.....red.....

beer....stella..carlsburg..

carb....coke.....pepsi....
然后,其中一人被要求通过复选框从0到13个选项中任意选择

通过搜索数据库,有多少其他人选择了相同的品种

显示在一个表格中,显示他们的所有名称以及他们为所有13个品种选择的内容

这有意义吗?我希望如此,因为它快把我逼疯了。

部分答案:

  • 通过排序和连接组成一组线性选择
  • 比较变成了一个简单的WHERE子句

因此,您首先要进行一次计算,将字符串放入某个字段,如“milk | semi | Skimed”(牛奶半脱脂)字面意思。

假设您有一个简单的布局,那么您将有类似的内容(我将自己限制为三个类别):

如果我理解正确,您的问题是:

当要求人员4选择0时。。在她的3个食物项中,她可以选择“面包”和“奶酪”复选框,这意味着查询应生成匹配的person 1。对吧?

SELECT
  PersonId,
  What_Milk,
  What_Bread,
  What_Cheese
FROM
  FoodPreference
WHERE
  PersonId != ?
  AND What_Milk   = IFNULL(NULLIF(?, ''), What_Milk)
  AND What_Bread  = IFNULL(NULLIF(?, ''), What_Bread)
  AND What_Cheese = IFNULL(NULLIF(?, ''), What_Cheese)
您的复选框值稍后将转到问号占位符所在的位置。(我已经用IFNULL/NULLIF替换了过去在这里使用的CASE-WHEN构造,它具有相同的效果,但对于PHP编写的语句更友好。)

如果未选中复选框(因此将值固定为某个值),则将相应列与自身进行比较。这意味着它的值不会影响结果。如果其他列匹配,将选择该行

这也意味着,如果用户选择了零个复选框,则将返回所有行。一个人选择的食物越多,匹配就越紧密

在PHP中,我建议您使用
mysqli\u prepare()
从查询字符串创建一个准备好的语句,并使用
mysqli\u stmt\u bind\u param()
将实际值绑定到问号占位符。这比直接构建SQL字符串安全得多。这个,看一看

SELECT  
    PersonId,  
    milk,  
    bread,  
    cheese
FROM  FoodPreference
WHERE  PersonId != :chosen_person_id  
    AND $milk= CASE WHEN :isset($_POST["milk"]))> '' THEN :isset($_POST["milk"]))   ELSE milk END  
    AND $bread= CASE WHEN :isset($_POST["bread"]))> '' THEN :isset($_POST["bread"]))  ELSE bread END  
    AND $cheese= CASE WHEN :isset($_POST["cheese"]))> '' THEN :isset($_POST["cheese"])) ELSE cheese END

我在正确的轨道上吗?

好的,我发布了一个回复,但托马拉克非常正确地指出了一个逻辑缺陷。我会再试一次:

将类别列为十三列的另一种方法是将它们列为如下表中的十三行:

CREATE TABLE FoodPreference (
  PersonID   INT NOT NULL REFERENCES People,
  FoodCat    VARCHAR(10) NOT NULL REFERENCES FoodCategories,
  FoodChoice VARCHAR(10) NOT NULL,
  PRIMARY KEY (PersonID, FoodCat)
);
INSERT INTO FoodPreference VALUES
  (123, 'bread', 'white'),
  (123, 'milk', 'skim'),
  (123, 'cheese', 'edam'), ...
  (321, 'bread', 'brown'),
  (321, 'milk', 'whole'),
  (321, 'cheese', 'edam'), ...
然后,您可以使用如下查询,将所选人员(p1)中的任意行与另一个人(p2)中具有相同食物选择的行进行匹配,并将其与该人(p3)的所有其他选择进行匹配:

WHERE子句中的“milk”、“bread”、“cheese”列表是您需要在PHP代码中构建的,它基于应用程序中的
$\u POST
变量。如果选中复选框,则将该食品类别包括在列表中

<?php
$food_cat_array = array("'none'");
$legal_food_cats = array('milk'=>1, 'bread'=>1, 'cheese'=>1, ...);
foreach (array_intersect_key($_POST, $legal_food_cats) as $key => $checked) {
  if ($checked) {
    $food_cat_array[] = "'$key'"; 
  }
}
$in_predicate = join(',', $food_cat_array);
$sql=mysql\u查询(“
挑选
*
来自“$prefix.”\u用户
其中username!='$username'
和req_country=IFNULL(NULLIF($b country,),req_country)
和req_region=IFNULL(NULLIF($bregion,,),req_region)
和req_type=IFNULL(NULLIF($btype',),req_type)
和req_beds=IFNULL(NULLIF($bbeds,),req_beds)
和req_值=IFNULL(NULLIF($bvalue,),req_值)
AND country=IFNULL(NULLIF($scontry,,),国家)
和region=IFNULL(NULLIF($sregion',),region)
和type=IFNULL(NULLIF($stype,),type)
床数=IFNULL(NULLIF($sbed,),床数)
AND value=IFNULL(NULLIF($svalue,,),value)
和pool=IFNULL(NULLIF($spool,),'Yes')
和garage=IFNULL(NULLIF($sgarage,,),>0)
和disabled=IFNULL(NULLIF($sdisabled,,,'Yes'));
$num=mysql\u num\u行($sql);
echo“总匹配数($num):

”; 而($row=mysql\u fetch\u数组($sql)){…等等
也许你还可以展示一下你打算如何在数据库中存储这些信息?这些表是什么样子的?嗨,哈格里姆。当然。表中有食品和原料名称作为文本字段。他们从每个字段中选择的内容都记录在他们的名称中。他们的名称是唯一的,并随用户名递增。只有一个表。所以表中有13个食物栏?嗨,Darryl。是的,还有一个名字和一个用户id。我认为有两个表会容易得多,一个有用户,一个有食物与用户id的关系。嗨,Tomalak。是的,如果你例子中的第4个人被要求选择,她选择了复选框面包和奶酪,那么选择sam的每个人都会选择面包和奶酪正如她所说,这两种食物都应该被显示。因为我们需要显示他们选择的所有内容,所以选择应该是*非PersonId?是的,勾选的复选框越少,结果就越多。勾选复选框缩小了搜索范围。我不知道这个情况下,term?将在何时查找它。是的,选择您需要的任何列,这是mea以nt为例。避免使用一般的“选择*”在生产代码中,它的效率较低。我赞同Tomalak的建议,即使用预先准备好的语句参数,而不是将PHP变量插入SQL表达式中。好的。那么,如果复选框的值出现在有空引号的地方?空引号在做什么?尝试使用“代码格式”按钮缩进您的代码,使其更具可读性。我猜您是这样想的我会更新我的例子,因为我知道你使用PHP。嗨,比尔。非常感谢你,看起来你在这个答案上花了很多心思。不幸的是,我的表已经修好了。我可以在另一个表中复制数据,但如果可能的话,我真的很想避免。我们能处理Tomalak的答案吗?我得到了到此为止。我已经扔掉了食物……现在正在使用我的实际值。不确定是否正确比较。请参阅下面我的新代码。获取一些mysql错误。无效的结果资源等。继续
SELECT DISTINCT p3.*
FROM FoodPreference AS p1
  JOIN FoodPreference AS p2 
    ON (p1.FoodCat = p2.FoodCat AND p1.FoodChoice = p2.FoodChoice 
      AND p1.PersonID != p2.PersonID)
  JOIN FoodPreference AS p3 
    ON (p2.PersonID = p3.PersonID AND p2.FoodCat != p3.FoodCat)
WHERE p1.PersonID = {(int)$chosen_person_id}
  AND p1.FoodCat IN ('milk', 'bread', 'cheese');
<?php
$food_cat_array = array("'none'");
$legal_food_cats = array('milk'=>1, 'bread'=>1, 'cheese'=>1, ...);
foreach (array_intersect_key($_POST, $legal_food_cats) as $key => $checked) {
  if ($checked) {
    $food_cat_array[] = "'$key'"; 
  }
}
$in_predicate = join(',', $food_cat_array);
$sql = mysql_query("        
    SELECT  
    *
    FROM  ".$prefix."_users
    WHERE  username !='$username'  
    AND req_country   = IFNULL(NULLIF($bcountry, ''), req_country)  
    AND req_region  = IFNULL(NULLIF($bregion, ''), req_region)  
    AND req_type = IFNULL(NULLIF($btype, ''), req_type)
    AND req_beds = IFNULL(NULLIF($bbeds, ''), req_beds)
    AND req_value = IFNULL(NULLIF($bvalue, ''), req_value)
    AND country   = IFNULL(NULLIF($scountry, ''), country)  
    AND region  = IFNULL(NULLIF($sregion, ''), region)  
    AND type = IFNULL(NULLIF($stype, ''), type)
    AND beds = IFNULL(NULLIF($sbeds, ''), beds)
    AND value = IFNULL(NULLIF($svalue, ''), value)
    AND pool = IFNULL(NULLIF($spool, ''), 'Yes')
    AND garage = IFNULL(NULLIF($sgarage, ''), >0) 
            AND disabled = IFNULL(NULLIF($sdisabled, ''), 'Yes')");
$num = mysql_num_rows($sql);
echo "Total matches ($num): <br><br>";
        while($row = mysql_fetch_array($sql)){...etc
case "display_results":

if ($bcountry = !isset($_POST["bcountry"])){
      $bcountry = "No";
      }else {
      $bcountry = "Yes";
      }
if ($bregion = !isset($_POST["bregion"])){
      $bregion = "No";
      }else {
      $bregion = "Yes";
      }
if ($btype = !isset($_POST["btype"])){
      $btype = "No";
      }else {
      $btype = "Yes";
      }
if ($bbeds = !isset($_POST["bbeds"])){
      $bbeds = "No";
      }else {
      $bbeds = "Yes";
      }
if ($bvalue = !isset($_POST["bvalue"])){
      $bvalue = "No";
      }else {
      $bvalue = "Yes";
      }
if ($scountry = !isset($_POST["scountry"])){
      $scountry = "No";
      }else {
      $scountry = "Yes";
      }
if ($sregion = !isset($_POST["sregion"])){
      $sregion = "No";
      }else {
      $sregion = "Yes";
      }
if ($stype = !isset($_POST["stype"])){
      $stype = "No";
      }else {
      $stype = "Yes";
      }
if ($sbeds = !isset($_POST["sbeds"])){
      $sbeds = "No";
      }else {
      $sbeds = "Yes";
      }
if ($svalue = !isset($_POST["svalue"])){
      $svalue = "No";
      }else {
      $svalue = "Yes";
      }
if ($spool = !isset($_POST["spool"])){
      $spool = "No";
      }else {
      $spool = "Yes";
      }
if ($sgarage = !isset($_POST["sgarage"])){
      $sgarage = "No";
      }else {
      $sgarage = "Yes";
      }
if ($sdisabled = !isset($_POST["sdisabled"])){
      $sdisabled = "No";
      }else {
      $sdisabled = "Yes";
      }

     $result = mysql_query("SELECT * FROM  ".$prefix."_users WHERE  username!='$username' 
AND (('$bcountry'='Yes' AND req_country= '$country') OR ('$bcountry'='No')) 
AND (('$bregion'='Yes' AND req_region= '$region') OR ('$bregion'='No'))
AND (('$btype'='Yes' AND req_type= '$type') OR ('$btype'='No'))
AND (('$bbeds'='Yes' AND req_beds= '$beds') OR ('$bbeds'='No'))
AND (('$bvalue'='Yes' AND req_value= '$value') OR ('$bvalue'='No'))
AND (('$scountry'='Yes' AND country= '$req_country') OR ('$scountry'='No'))
AND (('$sregion'='Yes' AND region= '$req_region') OR ('$sregion'='No'))
AND (('$stype'='Yes' AND type= '$req_type') OR ('$stype'='No'))
AND (('$sbeds'='Yes' AND beds= '$req_beds') OR ('$sbeds'='No'))
AND (('$svalue'='Yes' AND value= '$req_value') OR ('$svalue'='No'))
AND (('$spool'='Yes' AND pool= 'Yes') OR ('$spool'='No'))
AND (('$sgarage'='Yes' AND garage>=1 ) OR ('$sgarage'='No'))
AND (('$sdisabled'='Yes' AND disabled= 'Yes') OR ('$sdisabled'='No'))
")or die("MySQL ERROR: ".mysql_error());
$number = mysql_num_rows($result);