• Klo 11 alkaen tietokanta-ajoon liittyvä ongelma, joka aiheuttaa palvelinvirhettä viestejä lähettäessä. Viestien kirjoittaminen pois käytöstä väliaikaisesti. Pyrimme saamaan ongelman korjattua mahdollisimman pian. Pahoittelut häiriöistä.

Minkä takia INSERT lause antaa virheen?

Liittynyt
17.10.2016
Viestejä
481
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:

wex

Liittynyt
18.11.2016
Viestejä
31
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.
 
Liittynyt
01.01.2017
Viestejä
108
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:
Liittynyt
17.10.2016
Viestejä
481
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();
 
Liittynyt
05.02.2017
Viestejä
5 151
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.
 
Liittynyt
17.10.2016
Viestejä
985
Tai ihan
PHP:
$sql = $mysqli->prepare("INSERT INTO users (username, password, xp) VALUES (?, ?, ?)");
$sql->execute(array($username, $password, $xp));
if ($sql->rowCount()):
.....
 
Liittynyt
20.03.2017
Viestejä
184
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.
 
Toggle Sidebar

Uusimmat viestit

Statistiikka

Viestiketjut
239 584
Viestejä
4 191 453
Jäsenet
70 772
Uusin jäsen
PaulusKaita

Hinta.fi

Ylös Bottom