Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: Virheilmoitus mysqli_fetch_assoc-funktiosta

Sivun loppuun

E1ss [30.01.2017 16:29:30]

#

<?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.

Metabolix [30.01.2017 18:14:31]

#

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ä.

E1ss [31.01.2017 14:29:07]

#

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?

peran [31.01.2017 15:15:09]

#

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.

E1ss [31.01.2017 15:33:33]

#

ok kiitos nopeasta vastauksesta peran

peran [31.01.2017 15:43:07]

#

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ä).

E1ss [31.01.2017 18:24:44]

#

ok käyn katsomassa ne

E1ss [06.02.2017 14:53:52]

#

<?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";
	}
?>

peran [06.02.2017 15:47:28]

#

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/kyberturvallisuus/tietoturvanyt/2014/12/ttn201412220912.html

Putkassa keskustelua asiasta...
https://www.ohjelmointiputka.net/keskustelu/25713-salasanojen-suolaus/sivu-1

Tässä php.net:n juttua asiasta
https://www.php.net/manual/en/faq.passwords.php

E1ss [06.02.2017 17:24:16]

#

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.

Grez [06.02.2017 17:59:26]

#

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)

E1ss [06.02.2017 18:04:35]

#

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?

Grez [06.02.2017 18:26:54]

#

$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"

Metabolix [06.02.2017 18:27:03]

#

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.

E1ss [06.02.2017 18:29:09]

#

Kuinka saan taulun yhden sarakkeen kaikki jutut tallennettua taulukkoon.

Grez [06.02.2017 18:29:29]

#

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.

E1ss [07.02.2017 11:09:26]

#

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ä.

The Alchemist [07.02.2017 11:19:55]

#

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.

E1ss [07.02.2017 11:29:36]

#

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.

Grez [07.02.2017 11:53:52]

#

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.

E1ss [07.02.2017 12:44:51]

#

:D Grezin prosessori taisi ylikuumeta. Kannattaisi hommata sellanen vesijäähdytetty.

Grez [07.02.2017 12:51:54]

#

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.

E1ss [07.02.2017 12:53:31]

#

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.

The Alchemist [07.02.2017 16:31:53]

#

Voisit helposti korjata ongelman itsekin, jos lukisit virheilmoituksen. Ei kai tässä nyt jouduta jo lukemaankin sun puolestasi?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta