Minkä takia INSERT lause antaa virheen?

Liittynyt
17.10.2016
Viestejä
486
Olen tekemässä tietokantaa, johon pitäisi myöhemmin yhdistää pelin kautta. Sain tietokannan toimimaan käyttämällä koodia:

Koodi:
    if (!$nameTaken)
    {
        $sql = "INSERT INTO users (username, password, xp) VALUES('$username','$password','$xp')";
        if ($mysqli->query($sql) == TRUE)
        {
            echo "True";
            $AccountCreationSuccessful["AccountSuccessfullyCreated"] = true;
        
        } else
        {
            echo "Failed to Insert into Database";
        }

Haluaisin kuitenkin tehdä tämän käyttämällä preparea, koska se on ilmeisesti turvallisempi. Yritin tehdä sitä näin:
Koodi:
$sql = $mysqli->prepare("INSERT INTO users ('username', 'password', 'xp') VALUES (?, ?, ?)");
        $sql->bind_param($username, $password, $xp);    
        $sql->execute(); // Add Player
        $AccountCreationSuccessful["AccountSuccessfullyCreated"] = true;
Mutt tästä tulee aina virhe. Minulla on tietokannassa ID, username, password, xp kentät. Saako tuohon prepareen samanlaista varmistusta kuin ylempään (if ($mysqli->query($sql) == TRUE))?

Entä kuinka nämä SQL jutut saa suojattua Injectioneilta? Onko siihen jotain helppoa keinoa? Osaisitteko neuvoa :). Kiitos.

edit: Niin ja koitin myös näin:
Koodi:
        $sql = $mysqli->prepare("INSERT INTO users (username, password, xp) VALUES (:nam, :pass, :xp)");
        $sql->bind_param('nam', $username);  
        $sql->bind_param('pass', $password);  
        $sql->bind_param('xp', $xp);  
        $sql->execute(); // Add Player
        //$AccountCreationSuccessful["AccountSuccessfullyCreated"] = true;

Virheeksi tulee, että Sivu ei toimi Http Error 500. Se poistuu heti kun kommentoin koodit.
 
Viimeksi muokattu:
Haluaisin kuitenkin tehdä tämän käyttämällä preparea, koska se on ilmeisesti turvallisempi. Yritin tehdä sitä näin:
Koodi:
$sql = $mysqli->prepare("INSERT INTO users ('username', 'password', 'xp') VALUES (?, ?, ?)");
        $sql->bind_param($username, $password, $xp);   
        $sql->execute(); // Add Player
        $AccountCreationSuccessful["AccountSuccessfullyCreated"] = true;
Mutt tästä tulee aina virhe. Minulla on tietokannassa ID, username, password, xp kentät. Saako tuohon prepareen samanlaista varmistusta kuin ylempään (if ($mysqli->query($sql) == TRUE))?

Manuaali on ystävä (PHP: mysqli_stmt::bind_param - Manual):
Koodi:
bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
Eli ensimmäinen parametri kuvaa parametrien tyypit

execute() palauttaa booleanin statuksestaan. (PHP: mysqli_stmt::execute - Manual)

Suosittelisin käyttämään PDO:ta.
 
PHP:
$query = "INSERT INTO users (username, password, xp) VALUES (:nam, :pass, :xp)"
$params = array(
":nam" => $name,
":pass" => $pass,
":xp" => $xp
);

try {
 $stmt = $db->prepare($query);
 $stmt->execute($params);
} catch(PDOException $e) {
  //virhe tapahtunut, tietoa debugaukseen echo $e
}

PDO käyttöön, käsittääkseni mysqli piti olla jo vanhentunut.

Etkö saa servulle virheitä näkyviin?
 
Viimeksi muokattu:
Kiitos neuvoista, mutta ei toimi millään noista koodeista. Kopioin suoraan tuolta dokumentistakin ja vaihdoin vain muuttujien nimet ja silti tulee sama 500 virhe ja mitään ei tulostu. Ei edes virheitä. Pitääkö tässä muuttaa jotain .ini tiedostoja tms?

En ainakaan pääse itse käsiksi niihin, koska tuo on tilattu domaini, jossa kys. filut on palveluntarjoajalla. Pääsen itse käsiksi vain tietokantaan itseensä.

Koodi:
$stmt = $dbh->prepare("INSERT INTO users (username, password, xp) VALUES (:user, :pass, :xp)");
$stmt->bindParam(':user', $username);
$stmt->bindParam(':pass', $password);
$stmt->bindParam(':xp', $xp);

// insert one row
$username = 'one';
$password = 'Testi';
$xp = 3;
$stmt->execute();
 
Jos virheilmoitusten saaminen esiin on hankalaa, niin varmaan kannattaisi omalle koneelle pystyttää vastaavanlainen kehitysympäristö. Apache + MySQL (tai MariaDB) on helppo asentaa. Muuten kehitys on jatkossa yhtä helvettiä, vaikka tämä ongelma ratkeaisikin.
 
Tai ihan
PHP:
$sql = $mysqli->prepare("INSERT INTO users (username, password, xp) VALUES (?, ?, ?)");
$sql->execute(array($username, $password, $xp));
if ($sql->rowCount()):
.....
 
Jos ei pääse käsiksi mihinkään, ruikkaa errorit suoraan sivulle ( kannattanee luoda joku asd.php tätä varten).

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
$stmt = $db->prepare($query);
$stmt->execute($params);
} catch(PDOException $e) {
echo $e-getMessage();
}

Ilman virheilmoituksiahan tuo nyt on ihan ajanhukkaa, voi olla vaan unique constraint tms ja nysväät tunnin toimivan koodin kanssa. Skriptin kaatumisen syy ei edes välttämättä ole tuo pätkä vaan esim. myöhempi koodisi jos et tarkista $stmt->execute() palautusarvoa ja riviä ei lisättykään.
 

Statistiikka

Viestiketjuista
261 322
Viestejä
4 535 205
Jäsenet
74 789
Uusin jäsen
anykanen

Hinta.fi

Back
Ylös Bottom