• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed $_POST + ->query() nie działa w przeciwieństwie do stałej wartości

Object Storage Arubacloud
+1 głos
113 wizyt
pytanie zadane 14 sierpnia 2020 w PHP przez Oskar Szkurłat Bywalec (2,780 p.)
zamknięte 15 sierpnia 2020 przez Oskar Szkurłat

Cześć,
mam następujący problem, zrobiłem sobie komunikację z bazą danych mySQL z aplikacji napisanej w C# za pośrednictwem PHP. C# wywołuje PHP za pomocą WWWForm oraz WWW, co działa poprawnie dla wielu innych skryptów.
Jednak problem pojawia się, gdy jedna z funkcji otrzymuje dane za pomocą $_POST - wartości te są przepisywane do zmiennych, które następnie wykorzystywane są do conn->query(). Gdy wykorzystuje te zmienne to się query wysypuje (select nie zwraca wiersza, a identyczną komendą zwracam z bazy danych ręcznie).
Najdziwniejsze jest to, że gdy wpiszę bezpośrednio wartości stałe na tych samych zmiennych, to wszystko działa tak jak powinno. Tak więc "admin" nie jest równy "admin" z $_POST.
Sprawdziłem dla pewności typ zmiennej przychodzącej z $_POST - są to Stringi.
Nie bardzo wiem, dlaczego to nie działa, skoro w innych skryptach php zrobiłem identycznie. Czy jest jakaś możliwość, że wymagana, w którymś miejscu konwersja danych lub zrobiłem jakiś błąd szwedzki?

$_SESSION wykorzystuję tylko do diagnostyki, żeby wyświetlić sobie na konsoli w Unity.
 

<?php
	session_start();

	$roomName = $_POST['roomName'];
	$gmNick = $_POST['gmNickName'];
	//$roomName = "gggg"; //jak wpisuje constansy, to dziala
	//$gmNick = "admin";
	$_SESSION['createRoom_dataType'] = gettype($roomName).gettype($gmNick);
	$_SESSION['createRoom_room'] = $roomName;
	$_SESSION['createRoom_gmNick'] = $gmNick;

	require_once "connect.php";
	require_once "iniData.php";

	//***********TWORZENIE BAZY DANYCH DLA POKOJU***********
	$conn_createRoom = new mysqli($host, $db_user, $db_password);
	$conn_createRoom->query('CREATE DATABASE '.$roomName);
	$conn_createRoom->query('CREATE TABLE IF NOT EXISTS `'.$roomName.'`.`heroes` (
		`playerNick` TINYTEXT NOT NULL , 
		`build` INT NOT NULL , 
		`look` TINYINT NOT NULL , 
		`position` TINYTEXT NOT NULL , 
		`updatePosition` TINYINT NOT NULL , 
		`inventory` TINYTEXT NOT NULL , 
		`s3` SMALLINT NOT NULL , 
		`s4` SMALLINT NOT NULL , 
		`s5` SMALLINT NOT NULL
	) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci');
	$conn_createRoom->query('CREATE TABLE IF NOT EXISTS `'.$roomName.'`.`global` (
		`stage` SMALLINT NOT NULL ,
		`gm` TINYTEXT NOT NULL 
	) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci');
	$conn_createRoom->close();

	
	//***********ŁĄCZENIE SIĘ Z GŁÓWNĄ BAZĄ DANYCH***********
	$conn_globalDB = new mysqli($host, $db_user, $db_password, $ini_dbName);
	if ($conn_globalDB->connect_errno!=0)
	{ $_SESSION['createRoom_error'] = "[ createRoom.php:Err ] Connection error: ".$conn_globalDB->connect_errno; }
	else
	{
		$_SESSION['createRoom_stepInfo'] = "[ createRoom.php:StepInfo ] Connected to DB ".$ini_dbName;
		$gmNick = htmlentities($gmNick, ENT_QUOTES, "UTF-8");
		if ($result = @$conn_globalDB->query(
			sprintf("SELECT * FROM accounts WHERE playerNick='%s'",
			mysqli_real_escape_string($conn_globalDB, $gmNick))))
		{
			$rowsAmount = $result->num_rows;
			$_SESSION['createRoom_stepInfo'] = "[ createRoom.php:StepInfo ] SELECT done, rowsAmount: ".$rowsAmount;
			if($rowsAmount>0)
			{
				$gmData = $result->fetch_assoc();
				$gmBuild = $gmData['build'];
				$gmLook = $gmData['look'];
				$_SESSION['createRoom_gmBuild'] = $gmBuild;
				$_SESSION['createRoom_gmLook'] = $gmLook;
				

				echo date('Y-m-d H:i:s.u');
				$_SESSION['createRoom_date'] = date('Y-m-d H:i:s.u');
				$conn_globalDB->query(
					'INSERT INTO `rooms` (`room`, `usersAmount`, `date`) VALUES ("' 
					.$roomName. '", ' 
					.'1, "' 
					.date('Y-m-d H:i:s.u'). '")'
				);

				$result->free_result();
			} else { $_SESSION['createRoom_error'] = "[ createRoom.php:Err ] SELECT returned 0 rows";}
		} else { $_SESSION['createRoom_error'] = "[ createRoom.php:Err ] Could not execute query"; }
		$conn_globalDB->close();
	}

	//***********ŁACZENIE SIĘ ZE STWORZONĄ BAZĄ DANYCH POKOJU***********
	$conn_addHero = new mysqli($host, $db_user, $db_password, $roomName);
	$conn_addHero->query( "INSERT INTO `global` (`stage`, `gm`) VALUES (1, '$gmNick')" );
	$conn_addHero->query(
		'INSERT INTO `heroes` (`playerNick`, `build`, `look`, `position`, `updatePosition`, `inventory`, `s3`, `s4`, `s5`) VALUES ("' 
		.$gmNick. '", ' 
		.$gmBuild. ', ' 
		.$gmLook. ', "' 
		.$ini_arrayPos. '", ' 
		.$ini_upPos. ', "' 
		.$ini_arrayEq. '", ' 
		.$ini_r. ', ' 
		.$ini_r.  ', ' 
		.$ini_r. ")"
	);
	$conn_addHero->Close();
?>


<?php

    //Konfiguracja bazy danych serwera
    $ini_dbName = "gamedb";

    //Wartości początkowe podczas tworzenia pokoju
    $ini_r = 0;
    $ini_upPos = 1;
    $ini_arrayPos = "000000";
    $ini_arrayEq = "0000000000000000";

?>

<?php

    date_default_timezone_set('Europe/Warsaw');
    $host = "localhost";
    $db_user = "root";
    $db_password = "";

?>

public void createRoom()
    {
        room_name = room_nameInput.GetComponent<InputField>().text;
        Debug.Log("Room " + room_name + " has been done by " + local_user);
        
        WWWForm registerForm = new WWWForm();
        registerForm.AddField("roomName", room_name);
        registerForm.AddField("gmNickName", local_user);
        WWW put = new WWW(phpDir + "createRoom.php", registerForm);
        StartCoroutine(uploadData(put));
        string test;
        StartCoroutine(downloadData("get_createRoomData.php", (x) => test = x));
    }

 

komentarz zamknięcia: Sam znalazłem rozwiązanie i podałem je dla innych na przyszłość.
komentarz 15 sierpnia 2020 przez VBService Ekspert (254,300 p.)
edycja 15 sierpnia 2020 przez VBService

Sprawdzałeś co przychodzi w $_POST?

    
if (isset($_POST['roomName']) && isset($_POST['gmNickName'])) {
   echo "isset - ok<br>";
}
var_dump($_POST);
exit;

$roomName = $_POST['roomName'];
$gmNick = $_POST['gmNickName'];

 

komentarz 15 sierpnia 2020 przez Oskar Szkurłat Bywalec (2,780 p.)

Tak, sprawdziłem, do tego też sprawdziłem typ danych i zwraca dla obu String.

Jak wyświetlam sobie na konsoli to też jest normalnie dane, które wprowadziłem, czyli "admin" i "gggg".

komentarz 15 sierpnia 2020 przez Oskar Szkurłat Bywalec (2,780 p.)
edycja 15 sierpnia 2020 przez Oskar Szkurłat


Tak wygląda wynik konsoli, mimo, że $gmNick = admin, który istnieje w tabeli bazy danych accounts, to zwraca funkcja $result->num_rows ilość wierszy 0 (czyli nie znajduje użytkownika admin).
Poniżej zapis zapytania PHP<->mySQL:
 

$ini_dbName = "gamedb";
$conn_globalDB = @new mysqli($host, $db_user, $db_password, $ini_dbName);

$gmNick = htmlentities($gmNick, ENT_QUOTES, "UTF-8");
if ($result = @$conn_globalDB->query(
			sprintf("SELECT * FROM accounts WHERE playerNick='%s'",
			mysqli_real_escape_string($conn_globalDB, $gmNick))))
		{
			$rowsAmount = $result->num_rows;
			$_SESSION['createRoom_stepInfo'] = "[ createRoom.php:StepInfo ] SELECT done, rowsAmount: ".$rowsAmount;
			if($rowsAmount>0)
			{
			(...)
			}

 

1
komentarz 15 sierpnia 2020 przez Oskar Szkurłat Bywalec (2,780 p.)

Znalazłem problem... absurdalny, niewidoczny nawet na konsoli. Okazało się, że Input Fieldy z Unity z niewiadomych przyczyn zostawiały na końcu textu niewidzialny enter... 

$str = str_replace(PHP_EOL, '', $str);

Usuwanie znaków PHP_EOL pomogło, cały dzień w plecy na takiej głupocie angry.

Podobne pytania

+1 głos
1 odpowiedź 302 wizyt
pytanie zadane 19 grudnia 2020 w PHP przez MarKor Nowicjusz (180 p.)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 15 stycznia 2021 w PHP przez CSSoup Mądrala (6,460 p.)
0 głosów
1 odpowiedź 423 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez Bakr Mądrala (6,850 p.)

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...