2009-02-15 4 views
0

Привет, я делаю сайт в php с базой данных доступа к Microsoft через odbc, и я столкнулся с небольшой проблемой, позвольте мне сначала показать вам мои коды.php sql using odbc

<form method ="POST" action="maxtimestamplog.php"> 

Longitude <input type="text" name="longitude" /><br/> 
Latitude 
<input type ="text" name = "latitude"/> 
<input name="ok" type="submit" value="Submit" /> 
</form> 

<? 

$dbc = odbc_connect("X1","",""); // Trying to establish connection 
              // with database 
echo "<br>"; 

$datetime =date('Y-m-d H:i:s', strtotime('+8 hours')); 
echo "The Current date/time is $datetime"; 
echo "<br><br><br>"; 



if (!$dbc) 
{ 
    exit("Connection failed:".$dbc); 
} 
$x_origin = $_POST['longitude']; 
$y_origin = $_POST['latitude']; 
$query = " SELECT m.vehicle_no, 
l.longitude, 
    l.latitude, 
    l.timestamp 
FROM 
    vehicle_log AS l, 
    GPS_modem AS m 
WHERE 
    m.modem_ID = l.modem_ID 
    AND l.timestamp = (
    SELECT MAX(timestamp) FROM vehicle_log WHERE modem_ID = l.modem_ID 

) order by timestamp desc 
"; // SQL Statement 

$rs = odbc_exec($dbc,$query); 
    if (!$rs) 
    { 
     exit("Error in SQL. ".$rs); 
    } 
    $i=1; 
while (odbc_fetch_row($rs)) 
{ 
    $lng = odbc_result($rs, "longitude"); 
    $lat = odbc_result ($rs, "latitude"); 
    $ts = odbc_result ($rs, "timestamp"); 
    $vno = odbc_result ($rs, "vehicle_no"); 


    $yyyy= substr($ts, 0, 4); 
    $mm= substr($ts, 5, 2); 
    $dd= substr($ts, 8,2); 
    $hr= substr($ts, 11, 2); 
    $min= substr($ts, 14,2); 
    $sec= substr($ts,17, 2); 
    $cyyyy= substr($datetime, 0, 4); 
    $cmm= substr($datetime, 5, 2); 
    $cdd= substr($datetime, 8,2); 
    $chr= substr($datetime, 11, 2); 
    $cmin= substr($datetime, 14,2); 
    $csec= substr($datetime,17, 2); 

    $ctss = $csec 
        + ($cmin * 60) 
        + ($chr * 60 * 60) 
        + ($cdd * 24 * 60 * 60) 
        + ($cmm * 30 * 24 * 60 * 60) 
        + ($cyyyy * 365 * 24 * 60 * 60); 
    $tss = $sec 
        + (cmin * 60) + ($hr * 60 * 60) 
        + ($dd * 24 * 60 * 60) 
        + ($mm * 30 * 24 * 60 * 60) 
        + ($yyyy * 365 * 24 * 60 * 60); 

    $tssd = $ctss - $tss; 

    $x = $lng; 
    $y = $lat; 
    $i = $i + 1; 
    $xd = ($x - $x_origin); 
    $yd = ($y - $y_origin); 
    $d = ($xd*$xd) + ($yd*$yd); 
    $td = sqrt($d); 
    echo "Car Number $vno is at a distance $td away at timestamp $ts"; 
    echo "</br></br>"; 
} 
odbc_close($dbc); 
    ?> 
</HTML> 

то, что я хочу сделать сейчас, это показать только один выход не всех. Во-первых, я хочу, чтобы выбрать только те данные, где переменная $ tssd меньше или равно 10800, то я хочу, чтобы отобразить наименьшее $ тд из того, что я выбрал и Шоуда отображения

echo "Car Number $vno is at a distance $td away at timestamp $ts"; 
echo "</br></br>"; 

где $ тд является менее чем в пределах $ tssd меньше 10800 Он должен отображать только

Пожалуйста, попробуйте помочь мне, я совершенно новый для php, и мое заявление sql довольно беспорядочно, так как я испугаюсь.

+0

Строго говоря, вы не используете базу данных «MS Access», а базу данных Jet. Часть «Доступ» MDB (формы/отчеты/etc.) Не может использоваться через ODBC - могут использоваться только таблицы данных и запросы (т. Е. Чистые объекты Jet). И да, вы правы, что MS назвала драйвер ODBC «MS Access». –

+0

Строго говоря, это СУБД, а не «база данных», и они назвали драйвер «Microsoft Access». Но, эй, кто должен быть строгим? ;-) – onedaywhen

+0

Конечно, люди часто ссылаются на объекты MS Access (управление формой, функция NZ() и т. Д.) В объектах ACE/Jet (правило проверки, VIEW, PROCEDURE и т. Д.), Тем самым, при этом объекты ACE/Jet непригодны для использования ODBC, OLE DB и т. Д. – onedaywhen

ответ

1

Попробуйте отделить SQL от PHP.

Я полагаю, вы спрашиваете, как вернуть только одну строку, а не все строки. Для этого используйте ключевое слово «TOP». Например,

SELECT TOP 1 
    m.vehicle_no, 
    l.longitude, 
    l.latitude, 
    l.timestamp 

Для второй части Вашего вопроса, «где $ тд является наименее в пределах $ tssd меньше 10800», мы не знаем имен столбцов, что они относятся к. Если мы делаем вид, что они назвали TD и TSSD в vehicle_log таблице, то ваше заявление может выглядеть следующим образом:

SELECT TOP 1 m.vehicle_no, 
l.longitude, 
    l.latitude, 
    l.timestamp, 
    l.TD, 
    l.TSSD 
FROM 
    vehicle_log AS l, 
    GPS_modem AS m 
WHERE 
    m.modem_ID = l.modem_ID 
    AND l.timestamp = (
    SELECT MAX(timestamp) FROM vehicle_log WHERE modem_ID = l.modem_ID 

) 
    AND l.TD <= 10800 
    order by l.TD ASC 

Наконец, я изменил ORDER BY для размещения «я хочу, чтобы отобразить наименьшую $ тд».

Если это не то, что вы ищете, можете ли вы предоставить дополнительную информацию?