2015-05-04 16 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