2011-08-15 52 views
0

我有一些問題,宣佈在我的PHP語句中的值。子查詢之外的2個值聲明正確,但子查詢內部的值不起作用,並給出了未定義的索引:deviceName。在子查詢不起作用的PHP查詢中聲明變量。未定義指數:設備名稱

$sql4 = "SELECT endPort, startPort, 
     ( 
      SELECT deviceName 
      FROM devices 
      WHERE devices.deviceID = patching.endDeviceID 
     ) 
    FROM patching 
    WHERE deviceID = '$deviceID' 
    LIMIT 0 , 10"; 

    $query4 = mysql_query($sql4); 
    while ($row = mysql_fetch_array($query4)) 
     { 
      $startp = $row['startPort']; 
      $endp = $row['endPort']; 
      $endname= $row['deviceName']; 

      echo '<tr class="logm"><td>'.$startp.'</td><td></td><td>'.$endname.'</td><td></td><td>'.$endp.'</td><td></td></tr>'; 

     } 

是否有可能聲明這個值,我是做錯了還是有其他方式繞過這個問題。

+0

加入遠比子querries更有效 – 2011-08-15 09:51:24

回答

0

你沒有給子查詢結果的名字

SELECT endPort, startPort, deviceName 
    FROM patching 
    LEFT JOIN devices ON(devices.deviceID = patching.endDeviceID) 
WHERE patching.deviceID = '$deviceID' 
LIMIT 0, 10 
+0

謝謝你。我知道這很簡單,但在睡眠不足之後,我真的很掙扎。我明白你對使用連接的看法,但由於所需的信息,它實際上返回了錯誤的值。 – Shadoweski

+0

代替使用USING(設備ID)的嘗試ON(devices.deviceID = patching.endDeviceID)。這應該使用連接爲您提供正確的值。 –

+0

@ user346271:有什麼區別? \ [**編輯**哦,一個不是'deviceID' ..哎呀!好點。 \] –

0

您應該使用這個聯接:

SELECT endPort, startPort, deviceName 
FROM patching 
LEFT JOIN devices USING (deviceID) 
WHERE deviceID = '$deviceID' 
LIMIT 0 , 10 

注意:如果$deviceID是用戶輸入的,你有mysql_real_escape_string逃跑或使用prepared statements。雖然你應該使用聯接,而不是子查詢

SELECT endPort, startPort, 
    ( 
     SELECT deviceName 
     FROM devices 
     WHERE devices.deviceID = patching.endDeviceID 
    ) AS deviceName 
FROM patching 
WHERE deviceID = '$deviceID' 
LIMIT 0, 10 

+0

不要」噸忘記轉義'$ deviceID';) – rabudde