2015-05-04 17 views
2

我想创建一个基于PHP的搜索功能,用下面的代码:PHP mysql_fetch_array /行不显示独特的元素

<?php 
$d_name=$_POST['id']; 

//connect to the database 
$db=mysql_connect ("localhost", "root", "") or die ('I cannot connect to the database because: ' . mysql_error()); 
//-select the database to use 
$mydb=mysql_select_db("pgr"); 
if(!$mydb) 
    echo "db not selected"; 
//-query the database table 
$d_name=(int)$d_name; 

$sql="SELECT * FROM omimentry WHERE OMIM_ID=$d_name"; 


//-run the query against the mysql query function 
$result=mysql_query($sql) or die(mysql_error()); 
$n=mysql_fetch_array($result); 
//-create while loop and loop through result set 
if($n) 
       { 
       echo "<table border = 1 width=\"95%\" border=\"0\" cellpadding=\"2\" cellspacing=\"2\" class=\"text_black\"> 
       <tr class=\"yellow\"> 
        <td width=\"10%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">OMIM_ID</td> 
        <td width=\"20%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">location(chromosome)</td> 
        <td width=\"30%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">phenotype</td> 
        <td width=\"20%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">MIMnumber</td> 
        <td width=\"20%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">Gene</td> 
        <td width=\"20%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">GeneMIMnumber</td> 
        <td width=\"20%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">geneid</td> 
        <td width=\"30%\" align=\"center\" valign=\"middle\" class=\"text_black_bold\">protein</td> 

       </tr> "; 

        while($rows=mysql_fetch_row($result)) 
        { 
        echo " 
       <tr class=\"text_black\" align=\"left\" valign=\"middle\"> 
        <td width=\"10%\">$rows[1]</td> 
        <td width=\"20%\">$rows[2]</td> 
        <td width=\"30%\">$rows[3]</td> 
        <td width=\"10%\">$rows[4]</td> 
        <td width=\"20%\">$rows[5]</td> 
        <td width=\"20%\">$rows[6]</td> 
        <td width=\"20%\">$rows[7]</td> 
        <td width=\"30%\">$rows[8]</td> 
            </tr>"; 


       } 

       echo " </table> " ; 

      } 

      else 
       echo "Sorry Data Not Available"; 

?> 

的问题,这是相当独特的,是这个代码显示这些查询其有重复的条目(甚至对于那些,它显示最后一行的结果,而不是所有具有重复OMIM_ID的行)。而对于唯一的OMIM_ID,即使没有明确的错误,也没有结果。

表计划: INT OMIM_ID VARCHAR2位置(染色体) VARCHAR2表型 INT MIMnumber VARCHAR2基因 INT geneMIMNumber INT geneid VARCHAR2蛋白

什么我做错了任何线索?

--Update--

即使更新我的代码后:

<?php 
$d_name=$_POST['id']; 

$db = new PDO('mysql:host=localhost;dbname=pgr;charset=utf8', 'root', ''); 
if(!$mydb) 
    echo "db not selected"; 
//-query the database table 
$d_name=(int)$d_name; 

$stmt = $db->prepare("SELECT * FROM table WHERE id=?"); 
$stmt->execute(array($d_name)); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

    echo "<br>"; 
    echo "<br>"; 
    foreach($rows as $name => $value) { 
     echo "<tr><th>".htmlspecialchars($name). 
     "</th><td>".htmlspecialchars($value)."</th></tr>"; 
?> 

我收到同样的错误。

更新:对问题更清晰的看法。

Database: 
Table: 
int OMIM_ID|varchar2 location(chromosome)|varchar2 phenotype|int MIMnumber|varchar2 Gene|int geneMIMNumber|int geneid|varchar2 Protein 

Entries: 
2141|24q.xx|Some disease|4651|SomeID|56525|5625|SomeProteinID 
2141|21q.xx|Some disease|4651|SomeID|56545|5625|SomeProteinID 
2142|24q.xx|Some disease|4651|SomeID|56525|5625|SomeProteinID 

。现在,因为2141作为查询,代码会显示结果第2项,不是第一个,这应该被列入了。

如果2142是查询,没有输出,理想情况下,可以输出本来应该由OMIM_ID描述行2142

+6

请,[停止使用'mysql_ *'功能](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。他们不再被维护,并[正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。了解[准备的陈述](http://en.wikipedia.org/wiki/Prepared_statement),并考虑使用[PDO](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

@JayBlanchard,将通过它看,但我只是想知道这个代码有什么问题。 – Siddharth

+2

@Siddharth:你的意思是,除了你正在使用一个不推荐的扩展,并且你依赖于mysql隐式回退到最后一个活动连接,并且你正在回应标记(不要这么做,认真), **和**你似乎忘记数组是零索引('$ rows [0]'是第一个元素),***和***你很容易注入? –

回答

1

我不知道该怎么复制你指的是什么表和。因为你被破坏得很糟糕,所以我冒着被非常规代码欺骗的风险。

有关使用depreciated mysql的注释对您的代码没有影响,但他们只是不喜欢其他人为了解决方案来认为它可以使用mysql。当你发表一个问题时,他们没有意识到你有多么沮丧,他们是如何增加你的挫折感。他们的意思很好,但在你的情况下,你改变了你的代码来适应它们,你没有意识到它与解决方案无关。

注:该解决方案使用折旧MySQL的,而不是新的mysqli

这将消除重复:

while ($row = mysql_fetch_array($results, MYSQL_NUM)) { 
    $data[] = serialize(array($row[1],$row[2],$row[3],$row[4],$row[5])); 
} 
$data = array_unique($data); 

,要尽力保持第一个重复:

while ($row = mysql_fetch_array($results, MYSQL_NUM)) { 
    $data[] = serialize(array($row[1],$row[2],$row[3],$row[4],$row[5])); 
} 
$data = array_reverse ($data); 
$data = array_unique($data); 
ksort($data); // puts them back in original order. 

OR

while ($row = mysql_fetch_array($results, MYSQL_NUM)) { 
    $columns = serialize(array($row[1],$row[2],$row[3],$row[4],$row[5])); 
    if (!in_array($columns,$data)){ 
    $data[] = serialize(array($row[1],$row[2],$row[3],$row[4],$row[5])); 
    } 
} 

然后把新的循环是:

foreach($data as $key => $value){ 
    $row = unserialize($value); 


} 

还有其他的方式来使用这消除一些的DUP并排除他人。

$uniqueRows = serialize(array($row[1],$row[2])); 
$data[$uniqueRows] = array($row[3],$row[4],$row[5]); 
+0

啊,我的同情心。我的意思是,我使用OMIM_ID进行搜索,并且让OMIM_ID包含两个具有相同值的条目12345。现在,我的代码将显示包含12345的第二行,而不是第一行。另一种情况是,如果OMID_ID xyz是唯一的并且出现在单行中,则根本没有输出。 – Siddharth

+0

我更新了我的答案以反转阵列顺序。不确定它会有帮助。 – Misunderstood

+0

谢谢,我会尝试给出的建议,但我认为这不会有多大帮助。也许它必须采取措施来取得结果。 * Off-Topic start * *至于上面的原始问题的评论,我没有看到暗示更新标准**作为解决方案**而不是实际帮助查询的理由。我不认为建议C++ 14标准适用于与简单的数学运算相关的问题并不公平。* *结束题外话* – Siddharth