Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: Virheilmoitus mysqli_num_rows-funktiosta

E1ss [28.01.2017 15:26:11]

#

<?php
	$servername = "localhost";
	$server_username = "root";
	$server_password = "";
	$dbName = "cardpacks";

	$card = "";
	$cards = "";
	$ehto = true;

	//Make connection
	$conn = new mysqli($servername, $server_username, $server_password, $dbName);
	//Check Connection
	if(!$conn){
		die("Connection Failed. " . mysql_connect_error());
	}

	$i = 0;
	while($i < 7){
		RandomCard();

		$sql = "SELECT id FROM cardpacks WHERE cardpack1 = '".$card."' ";
		$result = mysqli_query($conn, $sql);

		while($ehto){
			//Get the result
			if(mysqli_num_rows($result) > 0){
				//Tieto löytyi tietokannasta
				echo "Tieto löytyi tietokannasta";
				$i--;
				continue;
			}else{
				//Kortti on uusi
				echo "Kortti on uusi";
				$cards = $cards . $card . ":";
				$ehto = false;
				continue;
			}
		}
		$i++;
	}

	echo $cards;


	function RandomCard(){
		for($i = 0; $i < 7; $i++)
	{
		$card = rand(2,14);

		switch($card)
		{
			case 14:
				$card = "A";
				break;
			case 13:
				$card = "K";
				break;
			case 12:
				$card = "Q";
				break;
			case 11:
				$card = "J";
				break;
			case 10:
				$card = "T";
				break;
			case 9:
				$card = 9;
				break;
			case 8:
				$card = 8;
				break;
			case 7:
				$card = 7;
				break;
			case 6:
				$card = 6;
				break;
			case 5:
				$card = 5;
				break;
			case 4:
				$card = 4;
				break;
			case 3:
				$card = 3;
				break;
			case 2:
				$card = 2;
				break;
		}

		$card = $card . rand(1,4);
		return $card;
	}
	}
?>

Tuossa on koodi ja tälläinen varoitus tulee:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Poker\Table.php on line 27


Mitä tuo tarkoittaa. Saa myös huomauttaa jos olen koodissa tehnyt virheen. Tarkoituksena olisi että tietokannassa olisi pakka kortteja ja joka kerta kun korttia ei ole tietokannassa tämä tallenetaan $cards muuttujaan. Kun $cards muuttujassa on 7 korttia se ilmestyy näytölle.

Huomasin että tein tällähetkellä väärin päin sen tarkistusjutun. Nyt se on siten että joka kerta kun kortti löytyy pakasta se etsii uuden vaikka se pitäisi olla toisin päin.

Kiitos kaikille jotka viitsivät vastata.

Lisäys: Lisäksi ongelmana on se että tietoa ei muka löydy tietokannasta.

peran [28.01.2017 17:48:07]

#

Onkohan jokin syy, miksi et käytä PDO:ta ?

https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=mysqlphp02

Varsinainen ongelma:
Käytät $card-muuttujaa, joka on RandomCard:n sisäinen, joten pääohjelmassa $card="", joten sql-hakusi etsii ''-arvoja riippumatta RandomCard:n määrittelemistä arvoista.

Teuro [28.01.2017 18:38:18]

#

Tuossa funktiossa RandomCard() on for-silmukka täysin turhaan, koska ensimmäisen kierroksen jälkeen palautetaan arvottu aakkosnumeerinen merkki ja satunnaisluku 1-4 yhdistettynä. Switch-rakenne luettelee myös ihan turhaan välin 2-9, mutta siitä pääsee halutessaan myös kokonaan eroon näin.

function RandomCard() {
	$values = Array(14 => "A", 13 => "K", 12 => "Q", 11 => "J", 10 => "T");
	$card = rand(2, 14);

	if ($card >= 10) {
		$card = $values[$card];
	}

	$card = $card . rand(1,4);

	return $card;
}

Muun koodin toimintaa en jaksa tarkemmin pohtia, mutta alla oleva saattaa toimia kuten ehkä tarkoitat.

<?php
$servername = "localhost";
$server_username = "root";
$server_password = "";
$dbName = "cardpacks";

$card = "";
$cards = Array();

$conn = new mysqli($servername, $server_username, $server_password, $dbName);

if (!$conn) {
	die("Connection Failed. " . mysql_connect_error());
}

while (count($cards) < 7){
	$card = RandomCard();

	$sql = "SELECT id FROM cardpacks WHERE cardpack1 = '{$card}'";
	$result = mysqli_query($conn, $sql);

	if (mysqli_num_rows($result) == 0) {
		$cards[] = $card;
	}
}

var_dump($cards);

function RandomCard() {
	$values = Array(14 => "A", 13 => "K", 12 => "Q", 11 => "J", 10 => "T");
	$card = rand(2, 14);

	if ($card >= 10) {
		$card = $values[$card];
	}

	$card = $card . rand(1,4);

	return $card;
}

Vastaus

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

Tietoa sivustosta