Új hozzászólás Aktív témák

  • Sk8erPeter

    nagyúr

    válasz csabyka666 #14955 üzenetére

    $sql = "SELECT * FROM tabla WHERE id=$value"; //ez így persze nem fut le, de a lényeget értitek...
    hogyan lehetséges az, hogy a mai napig látni összefűzött query-ket (NAGY HIBA!!), amik a potenciális veszélyforrásokat szépen magukba foglalják? Úgy értem, régen sokkal inkább tele volt a net akkora szar tutorialokkal, amikből az ember kezdőként sem győzött kukázni, szelektálni, hogy na most melyikben bízzak - de ma már van Google által nagyon jól indexelt Stack Overflow, ahol szerencsére legtöbbször a fejére koppintanak annak, aki ilyen csúfságokat akar elkövetni, meg van számtalan tutorial, ahol elsők között hívják fel a figyelmet arra, hogy sose bízz a felhasználótól érkező vagy általa bármilyen módon módosítható inputban, amikor adatbázis-lekéréssel foglalkozol.
    Nézz utána az SQL Injection fogalmának, aztán pedig a PDO-nak és a prepared statementeknek. Így nem kell tartanod SQL Injectiontől.
    Normális esetben ez valahogy így nézne ki csatlakozás után:

    // csatlakozás
    $db = new PDO(
    'mysql:host=localhost;dbname=test_db', // test_db-t módosítsd a megfelelő adatbázisnévre
    'root', // módosítsd
    '1234', // módosítsd
    array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;', // egyből UTF-8-ra fogja állítani kapcsolódás után a karakterkódolást
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // kivételeket fog dobálni probléma esetén
    )
    );


    $query = 'SELECT ez, az, amaz FROM tabla WHERE id=:id'; // inkább sorold fel a valóban szükséges mezőket, ne mindig a *-ot használd!!
    $stmt = $db->prepare ( $query );
    $stmt->bindValue( ":id", $value, PDO::PARAM_INT );
    $stmt->execute();

    foreach ($stmt as $row) {
    echo 'ez: '.$row['ez'].', az: '.$row['az'].', amaz: '. $row['ez'];
    }

    Itt láthatsz még bőven példát PDO használatára:
    http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers#Executing_prepared_statements_in_a_loop

    Itt bindParam()-ot használ:

    $values = array('bob', 'alice', 'lisa', 'john');
    $name = '';
    $stmt = $db->prepare("INSERT INTO table(`name`) VALUES(:name)");
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    foreach($values as $name) {
    $stmt->execute();
    }

    Itt egy példa tranzakciók használatára:

    try {
    $db->beginTransaction(); // note that calling beginTransaction() turns off auto commit automatically

    $db->exec("SOME QUERY");

    $stmt = $db->prepare("SOME OTHER QUERY?");
    $stmt->execute(array($value));

    $stmt = $db->prepare("YET ANOTHER QUERY??");
    $stmt->execute(array($value2, $value3));

    $db->commit();
    } catch(PDOException $ex) {
    //Something went wrong rollback!
    $db->rollBack();
    echo $ex->getMessage();
    }

Új hozzászólás Aktív témák