2013-01-08 58 views
0

我是PHP和mysql的全新产品,我正在尝试一些东西。在我的HTML中,我有一个表单,我输入里程并将其传递给PHP代码并转换为整数。然后我想采取并检查数据库隔离我想要的记录,以便我可以做一些计算。换句话说,如果输入的里程数(我将它保存在一个称为$ term的可靠数据中)小于或等于表中的里程数,我想使用符合此条件的记录。例如,我输入45英里,桌子上有40英里和50英里的记录,我想挑选50英里的水平。如果用户输入51,我想使用50级。像这样的东西。PDO select where

它很好地连接到数据库,但我不知道如何在foreach语句中构造此结构。 我有以下几点:

$term = (int)$_POST['term']; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=ratetable", $username, $password); 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT * FROM rates WHERE mileage<=term"; 
    foreach ($dbh->query($sql) as $row) 
     { 
     print $row['mileage'] .' - '. $row['ratepermile'] . '<br />'; 
     } 

    /*** close the database connection ***/ 
    $dbh = null; 
} 

当我这样做,我得到一个无效的参数提供的foreach()。

然后,我开始环顾四周,看到像这样的语句:

$stmt = $db->prepare('SELECT * FROM rates WHERE mileage<=:term'); 

,其中搜索参数传递等。

所以现在我很困惑什么正确的方法是在数据库中的里程升序列表中选择单个记录(最后匹配的记录与所有匹配的)满足条件或如何正确地构造WHERE论据。有什么建议么?

谢谢你的期待。

+0

看看['PDO :: prepare'](http://php.net/manual/en/pdo.prepare.php)manpage关于如何使用它来正确地传递变量。 - 问题不在循环中,而是在无效的SQL查询中;你没有传递一个变量,但是用原始的<= term“指定了一个无效列。 – mario

+0

是的,它应该是“WHERE里程<= $ term” – Nitroware

+0

“里程<=:term”更安全,如果你做了很多PHP/MySQL编程,它非常酷且更安全,但不必要这是一个快速修复。 – Nitroware

回答

0

您需要做的是使用WHERE子句与ORDER BYLIMIT子句结合使用。例如,为了获得小于或等于给定的搜索条件的最高值,你会怎么做:

SELECT * FROM rates 
WHERE mileage <= ? 
ORDER BY mileage DESC 
LIMIT 1 

为了得到大于或等于给定的搜索值的最低值做:

SELECT * FROM rates 
WHERE mileage >= ? 
ORDER BY mileage ASC 
LIMIT 1 

至于做实际的PDO,你会做这样的事情:

$stmt = $dbh->prepare('SELECT * FROM rates WHERE mileage <= ? ORDER BY mileage DESC LIMIT 1'); 
$stmt->execute(array($term)); 
$row_object = $stmt->fetchObject(); 
+0

哦!所以这匹配结果到最后匹配的记录?我假设 ?是用于标准的任何变量的占位符,对吗?谢谢迈克! – Shawn

+0

@Shawn这是正确的。另请参阅PDO使用示例的更新答案。 –

+0

谢谢!此外,我猜这几乎消除了迭代或使用foreach语句? – Shawn

0
$sql = "SELECT * FROM rates WHERE mileage<=term"; 

这是什么意思是从列里程< =列项的费率中选择*。我不认为你有列的术语,因为这应该是一个参数。

你是对的看看参数。代码应该是这样的:

$term = 150; 
$sth = $db->prepare('SELECT * FROM rates WHERE mileage<=?'); 
$sth->execute(array($term)); 

要获得唯一的你应该以纵列的顺序一个记录并获得唯一的LIMIT 1

$term = 150; 
$sth = $db->prepare('SELECT * FROM rates WHERE mileage<=? ORDER BY mileage DESC LIMIT 1'); 
$sth->execute(array($term)); 

因为你只需要1行,你可以这样做$ result = $ sth-> fetchColumn();而不是foreach。

+0

Hi Mihai,所以如果我不知道参数的确切值(因为$ term是一个变量,可以保存用户在网页上输入的任何内容),我仍然可以保持变量的结构和我一样? (将输入转换为整数)谢谢! – Shawn

+0

$ term = 150;只是一个占位符,你也可以做一个$ sth-> execute(array($ _ POST ['term']));如果你想。由于PDO语句受到保护,并且因为您正在使用参数,所以您可以安全地使用它。 –