0

私はPHPとmysqlが初めてで、ここで何かを試しています。私の HTML には、走行距離を入力する 1 つのフォームがあり、それが PHP コードに渡されて整数に変換されます。次に、それを取得してデータベースと照合して、必要なレコードを分離し、計算を実行できるようにします。つまり、入力されたマイレージ ($term という名前の変数に保存) がテーブル内のマイレージ以下である場合、この条件に一致するレコードを使用したいと考えています。たとえば、45 マイルと入力すると、テーブルには 40 マイルと 50 マイルのレコードがあり、50 マイル レベルを選択したいとします。ユーザーが 51 を入力する場合は、50 レベルを使用したいと考えています。そういうもの。

データベースにうまく接続しますが、 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 引数を正しく構造化する方法について混乱しています。助言がありますか?

ご覧いただきありがとうございます。

4

2 に答える 2

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

これが意味することは、列のマイレージ <= 列の用語である料金から * を選択することです。パラメータである必要があるため、列用語があるとは思いません。

パラメータを見るのは正しいです。コードは次のようになります。

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

レコードを 1 つだけ取得するには、列で並べ替え、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 の代わりに。

于 2013-01-09T00:03:24.910 に答える
0

あなたがする必要があるのは、節をand節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();
于 2013-01-09T00:00:12.187 に答える