【问题标题】:PHP - SQL Query filter+PHP - SQL 查询过滤器+
【发布时间】:2015-07-19 19:33:58
【问题描述】:

我正在编写一个 php 脚本,它将获取所需的信息并将其显示在 xml 中。出于某种原因,我的 brin 不起作用,我不知道如何进行查询。数据库有两个我想从中提取信息的表。两个表都有一个共同点,即“id_member”。主题表中有一堆垃圾 - 所以它有 4 个库 - 'id_member'、'id_theme'、'varible' 和 'value'。我想过滤“变量”中有两个项目(显示它们而不是其余的)“cust_armaus”和“cust_armamo”然后值当然会显示值。因此,在表 Themes 中,id_member 将不止一次列出以显示不同的变量。这就是我得到的对我不起作用的东西:

    <?php
header('Content-Type: text/xml');
$username="database_username";
$password="database_password";
$database="database_name";
mysql_connect('localhost',$username,$password);
@mysql_select_db($database) or die( "Unable to select database");

echo "<?xml version=\"1.0\"?>\n".
     "<!DOCTYPE squad SYSTEM \"squad.dtd\">\n".
     "<?xml-stylesheet href=\"squad.xsl?\" type=\"text/xsl\"?>\n";
?>
<squad nick="Team Tag">
    <name>Team Name</name>
    <email>contact@team.com</email>
    <web>http://www.team.com</web>
    <picture>teamlogo.paa</picture>
    <title>This is the Team motto</title>
<?php

// smf_themes -> id_member = 
// smf_themes -> variable for cust_armaus & cust_usermo
// smf_themes -> value <- get for cust_armaus & cust_usermo
// smf_members -> real_name = profile_name & name
// smf_members -> email_address = email - NO

$memberSQL = mysql_query("SELECT id_member AS id, real_name FROM smf_members");
$member = mysql_fetch_array($memberSQL);
$armausSQL = mysql_query("SELECT id_member, variable, value AS arma_id FROM smf_themes WHERE id_member='$member[id]' AND variable='cust_armaus'");
$armaid = mysql_fetch_array($armausSQL);
$armamoSQL = mysql_query("SELECT id_member, variable, value AS motto FROM smf_themes WHERE id_member='$member[id]' AND variable='cust_usermo'");
$armamo = mysql_fetch_array($armamoSQL);

  $num=mysql_numrows($member, $armaid, $armamo);
  mysql_close();
  $i=0;

  while ($i < $num) {
   $profile_id = mysql_result($armaid,$i,"value");
   $profile_name = mysql_result($member,$i,"real_name");
   $profile_remark = mysql_result($armamo,$i,"value");
   $profile_username = mysql_result($member,$i,"real_name");
   //$profile_email = mysql_result($result,$i,"email");
   //$profile_icq = mysql_result($result,$i,"icq");

   echo "<member id=\"$profile_id\" nick=\"$profile_name\">" .
        "<name>$profile_name</name>".
        "<email>$profile_email</email>".
        "<icq>$profile_icq</icq>".
        "<remark>$profile_remark</remark>".
    "</member>\n";

   $i++;
  }
?>
</squad>

【问题讨论】:

  • 一方面,你过早地关闭了你的连接mysql_close();
  • 另外,我认为这是一个自定义函数mysql_numrows()?如果不是,则缺少下划线。
  • 对于一个单一的答案来说,这个错误太多了。除了关于过早调用mysql_close 的cmets,以及接受三个参数的神秘mysql_numrows 函数......smf_themes 的查询仅针对从smf_members 返回的第一行运行。 while 循环不应该在$i 上,它应该是while ($row= ...fetch...( )) 循环。除了所有这些问题,mysql 接口已被弃用;新开发应使用mysqliPDO

标签: php mysql xml


【解决方案1】:

mysql 接口已弃用。新开发应使用mysqliPDO

假设对于每个 smf_members,您只有一个 cust_armauscust_usermo 行的值,您可以在 SELECT 列表中使用相关子查询,并仅返回一个查询,该查询为smf_members。像这样的:

  SELECT m.id_member AS id
       , m.real_name
       , (SELECT a.value
            FROM smf_themes a
           WHERE a.id_member = m.id_member
             AND a.variable = 'cust_armaus'
           ORDER BY a.value LIMIT 1
         ) AS cust_armaus
       , (SELECT u.value
            FROM smf_themes u
           WHERE u.id_member = m.id_member
             AND u.variable = 'cust_usermo'
           ORDER BY u.value LIMIT 1
         ) AS cust_usermo 
    FROM smf_members m  
   ORDER BY m.id_member 

如果保证(id_member,variable) 元组在smf_themes 中是唯一的,您可以使用更简单的外连接:

  SELECT m.id_member AS id
       , m.real_name
       , a.value AS cust_armaus 
       , u.value AS cust_usermo 
    FROM smf_members m
    LEFT  
    JOIN smf_themes a 
      ON a.member_id = m.member_id AND a.variable = 'cust_aramus'
    LEFT  
    JOIN smf_themes u 
      ON u.member_id = m.member_id AND u.variable = 'cust_usermo'
   ORDER BY m.id_member 

对于这些查询中的任何一个,您都可以使用如下代码:

  $sql = "SELECT ...";
  $rs = $mysqli->query($sql)
  if (!$rs) {
    // handle error
    echo 'query failed: (' . $mysqli->errno . ') ' . $mysqli->error;
    die;
  }
  // loop through rows returned
  while ( $row = $rs->fetch_assoc() ) {
    echo '<member id="' . htmlspecialchars($row['id']) . '"'
       . ' nick="' . htmlspecialchars($row['real_name']) . '">'
       . '<cust_aramus>' . htmlspecialchars($row['cust_aramus']) . '</cust_aramus>'
       . '<cust_usermo>' . htmlspecialchars($row['cust_usermo']) . '</cust_usermo>' ;
  }

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2021-05-26
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多