<?php $servername = "localhost"; $server_username = "root"; $server_password = ""; $dbName = "poker"; $username = $_POST["usernamePost"]; $password = $_POST["passwordPost"]; //Make connection $conn = new mysqli($servername, $server_username, $server_password, $dbName); //Check Connection if(!$conn){ die("Connection Failed. " . mysql_connect_error()); } AddPlayerTabel($conn, $username, $password); function AddPlayerTabel($conn, $username, $password){ $sql = "SELECT username FROM table1 WHERE username = '".$username."' "; $result = mysqli_query($conn, $sql); //Tarkistaa onko pelaaja jo pöydässä. if(mysqli_num_rows($result) > 0){ echo "username is allready on table"; }else{ //Tarkistaa onko pelaaja oikea. $sql = "SELECT password FROM pokerusers WHERE username = '".$username."' "; $result = mysqli_query($conn, $sql); //Get the result and confirm login if(mysqli_num_rows($result) > 0){ //show data each row while($row = mysqli_fetch_assoc($result)){ if($row['password'] == $password){ //pelaaja on oikea henkilö. $sql = "INSERT INTO table1 (username, sitting) VALUES ('".$username."','1')"; $result = mysqli_query($conn,$sql); if(!$result) echo "There was problem."; else echo "Player added to table succesful."; }else{ //Hakkeri echo "Password incorrect"; } } }else{ echo $username." not found"; } } } ?>
Tossa koodi ja tässä tulostus:
Player added to table succesful.<br />
<b>Warning</b>: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in rivillä 41
Eli tietääkö joku mistä tämä johtuu. Olen useamman tunnin yrittänyt saada netsitä selville mutta mikään ratkaisu ei ole toiminut. Haluaisin että player added to table succeful näkyvän mutta varoitusta ei pitäisi näyttää. Ohjelman suoritukseen virhe ei taida vaikuttaa mutta teksti on ärsyttävä jos haluaa lukea sivua.
Ongelma on siinä, että koodissasi on turha while-silmukka, jonka sisällä muutat $result-muuttujan arvoa, jolloin $result on seuraavalla kierroksella väärä. Ongelman voi helposti päätellä siitä, että tulosteessa näkyy ensin silmukan sisällä oleva asia ja sitten vasta virheilmoitus, eli selvästi virhe tulee silmukan toisella kierroksella. Poista while-silmukka, kun kerran haluat hakea vain yhden tuloksen.
Toinen, erillinen ongelma on koodissasi oleva SQL-injektion mahdollisuus. Älä koskaan lisää muuttujia SQL-kyselyyn tuolla tavalla ("kysely".$muuttuja
), paitsi jos olet niin taitava, että ihan varmasti ymmärrät tilanteen. Käytä parametrisoituja kyselyitä, kuten PDO-oppaassa neuvotaan.
Ylipäänsä olisi hyödyllistä opetella ensin ohjelmoinnin ja tietokantojen alkeet ja sitten vasta lähteä tällaiseen verkkopeliprojektiin.
Kannattaisi myös käyttää keskustelussa vain yhtä tunnusta eikä sotkea keskustelua kahdella eri nimimerkillä.
Kiitos paljon vastauksista. Tuo while silmukan poisto korjasi asian. Olen itsekkin ruvennut harkitsemaan phpn kunnolla opettelua koska nyt ymmärrän miten laaja ja monimutkainen asia on kyseessä. Sanokaapas onko tämä ohjelmointisivun videot viellä päteviä. Videot on noin 5 vuotta sitten tehtyjä joten onkohan materiaali vanhentunut. Olen nimittäin ennen kokeillut thenewbostonin videoita ja ne ovat osoittautuneet parhaiksi ja viihdyttävimmiksi. Vai onko viellä parempia paikkoja opiskella esim. tämän nettisivun opas. Haluaisin mahdollisimman nopeasti oppia mahdollisimman paljon asiaa jotta pokeri projektini onnistuisi.
Lisäys: Ei tuo tutoriali ollutkaan kovin hyvä. Voisiko joku ehdottaa jonkun hyvän paikan opiskella phpn ja mysql tärkeimmät asiat.
Lisäys: Onko tällä sivulla oleva opas hyvä vai onko siinä oleva tieto vanhentunut?
En jaksanut kahlata kyseisen sivun videoita läpi.
Minun mielestäni kyseiset videot etenevät erittäin hitaasti.
Suosittelen mieluummin ohjelmointiputkan omaa opasta:
https://www.ohjelmointiputka.net/oppaat/
Toki noi thenewbostonin videot kertovat tarpeelliset tiedot, jos kärsivällisyyttä riittää.
Edit - Se mikä kyseisessä videopläjäyksessä on vanhentunutta on MySQL:n käpistely, kun kyseiseen käpistelyyn löytyy PDO, joka on ainakin tuoreempi tapa käsitellä tietokantoja, kuin noi proseduraaliset käskyt. PDO on esitelty putkan oppaassa.
ok kiitos nopeasta vastauksesta peran
Jos katselet videoita, niin katso ainakin 132:s (Beginner PHP Tutorial - 132 - LIKE with a Search Engine Example) video, jossa esitellään kuinka kierretään SQL-injektio, mutta tosiaan PDO:ssa SQL-injektion estäminen tapahtuu helpommin ymmärrettävänä(/ ja vähemmillä näppäilyillä).
ok käyn katsomassa ne
<?php $servername = "localhost"; $server_username = "root"; $server_password = ""; $dbName = "fmpp"; $username = $_POST["usernamePost"]; $password = $_POST["passwordPost"]; // muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=$servername;dbname=$dbName", "$server_username", "$server_password"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // merkistö: käytetään latin1-merkistöä; toinen yleinen vaihtoehto on utf8. $yhteys->exec("SET NAMES latin1"); // valmistetaan kysely $kysely = $yhteys->prepare("SELECT password FROM users WHERE username = ?"); // suoritetaan kysely $kysely->execute(array($username)); $tulos = $kysely->fetch(); if(fetch > 0){ if($row['password'] == $password){ echo "Login success"; }else{ echo "Password incorrect"; } }else{ echo " ".$username." not found"; } ?>
Katsoisiko joku onko tuo koodi oikeaoppisesti kirjoitettu ja mahdollisimman turvallisesti.
Lisäys:
Anteeksi tuo ylempi koodi oli väärä. Tässä alapuolella oikea.
<?php $servername = "localhost"; $server_username = "root"; $server_password = ""; $dbName = "poker"; $username = $_POST["usernamePost"]; $password = $_POST["passwordPost"]; // muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=$servername;dbname=$dbName", "$server_username", "$server_password"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // merkistö: käytetään latin1-merkistöä; toinen yleinen vaihtoehto on utf8. $yhteys->exec("SET NAMES latin1"); $kysely = $yhteys->prepare("SELECT password FROM pokerusers WHERE username = ?"); $kysely->execute(array($username)); $tulos = $kysely->fetch(); //Get the result and confirm login if($tulos > 0){ if($tulos['password'] == $password){ echo "Login success"; }else{ echo "Password incorrect"; } }else{ echo $username." not found"; } ?>
E1ss kirjoitti:
Katsoisiko joku onko tuo koodi oikeaoppisesti kirjoitettu ja mahdollisimman turvallisesti.
Huomattava parannus vanhaan, mutta nykyään on lisäksi tapana tiivistää ja suolata salasanat, jottei niitä nähdä selväkielisenä tietokannassa.
https://www.viestintavirasto.fi/
Putkassa keskustelua asiasta...
https://www.ohjelmointiputka.net/keskustelu/
Tässä php.net:n juttua asiasta
https://www.php.net/manual/en/faq.passwords.php
Kiitos peran
Lisäys:
function AddPlayerToGame($yhteys){ $kysely = $yhteys->prepare("SELECT * FROM table1"); $kysely->execute(); $tulos = $kysely->fetch(); foreach($tulos as $x){ echo "x = $x \n"; } }
Miksi tuo ei tulosta kaikkia rivejä? Se tulostaa vain ensimmäisen rivin sarakkeet.
Lisäys:
function HowManySitting($yhteys){ $kysely = $yhteys->prepare("SELECT count(*) FROM table1 WHERE sitting = 1"); $kysely->execute(); $tulos = $kysely->fetch(); foreach($tulos as $x){ echo $x . "\n"; } return $tulos; }
Ja miksi tämä tulostaa kaksi kertaa 3 vaikka haluan sitting 1 omaavien pelaajien lukumäärän vain kerran.
Ekassa tapauskessa pyydät tulostamaan tasan 1 rivin (jos rivejä on 0 niin tulee virheilmoitus).
Toisessa tapauksessa tulostat kaikki tulos -taulukon arvot, siis sekä avaimen 0 arvon 3, että count(*) avaimen arvon, joka myös on 3. (Lue Fetch dokumentaatiosta kohta PDO::FETCH_BOTH (default)
Millä perusteella pyydän tulostamaan vain yhden rivin. Eikö foreach tee sen sisällä olevaa juttua niin pitkään kuin $tulos listan kaikki kohdat on käyty läpi?
$tulos sisältää yhden rivin, sen jonka hait edellisellä rivillä fetch()-komennolla.
foreach käy siis läpi yhden tulosrivin kunkin sarakkeen. Tulostaa siis kustakin sarakkeesta "x = {sarakkeena arvo} \n"
Se $tulos on yksi rivi. Jos haluat kaikki rivit, käytä metodia fetchAll.
Olisiko ihan mahdoton ajatus, että lukisit oppaista nämä perusasiat? Siellä kyllä näytetään, miten rivejä haetaan.
Kuinka saan taulun yhden sarakkeen kaikki jutut tallennettua taulukkoon.
Metabolix kirjoitti:
Jos haluat kaikki rivit, käytä metodia fetchAll.
fetchAll asemesta voi myös loopata fetchiä
tyyliin
while($tulos = kysely->fetch()) { //käytä yhtä riviä kerrallaan täällä }
Metabolix kirjoitti:
Olisiko ihan mahdoton ajatus, että lukisit oppaista nämä perusasiat? Siellä kyllä näytetään, miten rivejä haetaan.
Toinen ääni tälle. Pitäisi ehkä lopettaa vastaamasta näihin, kun tuntuu että se vaan ruokkii omatoimettomuutta.
Minusta on parempi kysyä täällä kuin selvittää itse koska näin minun ei tarvitse tuhlata 10-15min etsien vastausta kuin voin postata sen tänne ja saan vastauksen silläaikaa kun teen jotain muuta. Eikö tämä koko foorumin idea perustu siihen että ne joilla on aikaa ja tietoa voi auttaa niitä jotka eivät jaksa etsiä vastausta netistä.
Tuollainen asenne ei osoita vähäisintäkään kunnioitusta muita kirjoittelijoita kohtaan, joten ei kannata odottaa, että sinulle välttämättä enää kovin usein vastattaisiin asiallisiinkaan kysymyksiin.
En tarkoittanut tuota pahalla. Arvostan suuresti sitä kuinka viitsitte käyttää aikaanne ongelmiini. En vain yksinkertaisesti ymmärrä dokumentaatioita enkä osaa etsiä kaikkiin ongelmiini vastauksia. En esimerkiksi vielläkään saa toimimaan tätä koodia vaikka olen jo lukenut monet dokumentaatiot ja saanut paljon vastauksia.
function AddPlayerToGame($yhteys, $poydassa){ $kysely = $yhteys->prepare("SELECT * FROM table1"); $kysely->execute(); while($poydassa > 0){ $poydassa--; while($tulos = $kysely->fetch()){ echo "tulos = " . $tulos . "\n"; } } }
Miksi tämä tulostaa seuraavan tekstin:
<br />
<b>Notice</b>: Array to string conversion in <b>C:\xampp\htdocs\Poker\table1.php</b> on line <b>43</b><br />
tulos = Array
<br />
<b>Notice</b>: Array to string conversion in <b>C:\xampp\htdocs\Poker\table1.php</b> on line <b>43</b><br />
tulos = Array
<br />
<b>Notice</b>: Array to string conversion in <b>C:\xampp\htdocs\Poker\table1.php</b> on line <b>43</b><br />
tulos = Array
Lisäys: Nyt keksin.
E1ss kirjoitti:
Minusta on parempi kysyä täällä kuin selvittää itse koska näin minun ei tarvitse tuhlata 10-15min etsien vastausta kuin voin postata sen tänne ja saan vastauksen silläaikaa kun teen jotain muuta.
Samalla voisi myös todeta, että kannattaa palkata joku muu tekemään se softa, niin ei tarvitse tuhlata itse aikaa asioiden opetteluun.
Se jos sulla menee 10-15 minuuttia tuollaisen asian selvittämiseen dokumentaatiosta (vs. 1-2 minuuttia joka olisi normaali) kertoo ihan vaan siitä, että et ole vielä opetellut riittävästi asioiden lukemista dokumentaatiosta. Normaaliin koodaajan osaamiseen kuuluu tarkistaa tuollaiset perusasiat itse ja normaali koodaaja myös selvittää tuollaisen ongelman itse lyhyemmässä ajassa, kuin mitä kestää kirjoittaa kysymys foorumille.
Myöskin mitä nyt tätäkin keskustelua lukee, niin et tunnu oppivan yhtään mitään muiden vastauksia lukemalla.
E1ss kirjoitti:
Eikö tämä koko foorumin idea perustu siihen että ne joilla on aikaa ja tietoa voi auttaa niitä jotka eivät jaksa etsiä vastausta netistä.
Juu ei!. Foorumin idea on jakaa tietoa ja auttaa niitä, jotka omasta yrityksestä huolimatta eivät ole saaneet jotain ongelmaa ratkaistua tai esimerkiksi pohtia mikä eri ratkaisuista on järkevin. Idea ei ole tehdä toiseten töitä toisten puolesta sen takia että toiset on liian laiskoja opettelemaan itse.
:D Grezin prosessori taisi ylikuumeta. Kannattaisi hommata sellanen vesijäähdytetty.
Jos luulit että olisin jotenkin hermostunut niin ei pidä paikkaansa.
Koitin ihan vaan ystävällisesti kertoa miksi asioita kannattaisi opetellakin ja toisaalta oioin väärinkäsitystäsi foorumin tarkoituksesta.
Grez haluisitko tehdä tämän ohjelman. Voin maksaa hyvin. Saat korin halvinta kaljaa palkaksi. Jos teet työsi hyvin saatan ostaa viellä makkarapaketin.
Lisäys: :D Vitsi vain. Älä suutu tuosta Grez. Arvostan suuresti apuasi monissa ongelmissani ja toivon että voin vastaisuudessa saada lisää apua. Lupaan tästä lähin pyrkiä tutkimaan asiaa tarkemmin ennen kuin tänne tulen kyselemään. Teen vaikka niin että päivän etsin tietoa jostain jos en löydä niin tulen tänne kyselemään. Nyt voimme varmaan lopettaa tämän turhanpäiväisen kiistelyn joka turhaan täyttää hyvän foorumin tietokantaa.
Voisit helposti korjata ongelman itsekin, jos lukisit virheilmoituksen. Ei kai tässä nyt jouduta jo lukemaankin sun puolestasi?
Aihe on jo aika vanha, joten et voi enää vastata siihen.