PHP veritabanı tek satır sorgu

3 Cevap php

Ben bir sql sorgudan tek bir satırını yankılanan bir sorun yaşıyorum. Ben bu hala oldukça yeni ama ben onu hiç bilemiyorum.

Ben "listing.php? Id = 7" başlıklı bir sayfa var

Sayfanın içinde bu betik:

<?php
mysql_connect("localhost","user","pass"); 
mysql_select_db("table"); 

$query = "SELECT * FROM vehicles WHERE id='$id'";
$result = mysql_query($query);

while($r=mysql_fetch_array($result))
{   

$year=$r["year"];
$make=$r["make"];
$model=$r["model"];
$miles=$r["miles"];
$pricepay=$r["pricepay"];
$pricecash=$r["pricecash"];
$transmission=$r["transmission"];
$color=$r["color"];
$vin=$r["vin"];

echo"$year $make $model $miles $pricepay $pricecash $transmission $color $vin<br />";

}
?>

Sorun "WHERE id = '$ id'" içinde yatıyor. Ben bir var kullandığınızda, hiçbir şey gösterir, ama ben elle o benim kimlik numarasını, örnek 7 yaparsanız, iyi çalışıyor. Neler ben yanlış yapıyorum?

3 Cevap

Orijinal kodunuzu alın ve sorgudan önce bu satırı ekleyin:

$id = (int)$_GET['id']; // Sanitize Integer Input

Diğerleri tırnak kaldırmak için önerilen ve sorguyu değiştirin:

$query = "SELECT * FROM vehicles WHERE id=$id";

Ben senin id 1 başlar normal mysql auto_increment olduğunu varsayarak yaşıyorum. That `$ _GET ['id'] bir dizi ama bir şey ise, 0 olarak geri gelecek demektir ve bu nedenle veri tabanında bir şey aynı değildir.

eğer

SELECT * FROM vehicles WHERE id=7

ama çalışıyor

SELECT * FROM vehicles WHERE id='$id'

doesn't work then get ride of the quotes around $id

Bu yüzden

SELECT * FROM vehicles WHERE id=$id

The quotes are turing $id into a string comparison - which won't work eğerthe column type is integer.

Daha da iyisi, kullanmak PDO. Bağlantısı oluşturun:

$db = new PDO("mysql:host=localhost;dbname=someDBname", 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

ancak, sadece bir script bunu tercihen bir singleton veya somesuch içinde. Bu tek bir dosyada tüm veritabanı şifreleri yerleştirerek (güvenli kolay olduğu) ve bağlantı başarısız olmasına neden hostname, veritabanı adı, kullanıcı adı veya şifre yazım hataları olasılığını azaltmak gibi birçok avantajı vardır. : Olarak kullanın

try {
    $query = $db->prepare(
        "SELECT year, make, model, miles, pricepay,
                pricecash, transmission, color, vin 
           FROM vehicles WHERE id=?"
    );
    $query->execute(array($_REQUEST['id']));
    while ($row = $query->fetch(PDO::FETCH_NUM)) {
        echo implode(', ', $row);
    }
} catch (PDOException $exc) {
    echo "Query failed.";
}

Bu SQL injection savunmasız değildir ki, bir prepared query kullanır. Ayrıca, does away with "or die".

Eğer singletons görmedim durumda, burada bir örnek:

class DB {
    private static $db;
    static function open() {
        if (! isset(self::$db) ) {
            self::$db = new PDO('mysql:host=hostName,dbname=dbName', 'user', 'password');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$db;
    }
}

Eğer bir bağlantı gerekir zaman sonra, sadece DB::open() diyoruz. Bunun yerine DB daha, DB içinde bir ilişkisel dizi birden barındıran, mağaza PDO'ların bağlanmak :: $ db gerekir. Bu durumda, DB komut bağlantı bilgilerini koymak olabilir, ya da DB ayrıştırır, ayrı bir konfigürasyon dosyasına koydu.