Niedziałający if PHP

0

Cześć, szybkie pytanie. Dlaczego nie działa mi ten kod? Szukam i szukam i nie mogę znaleźć błędu. Z bazą się łączy, w bazie są dane. Kolumna Stan ma wartość 1. Wywala się if tak jakby nie czytał to co jest w kolumnie Stan i nie sprawdzał warunku.

<?php
include 'connect.php';

$sql = "SELECT Obszar, Poziom, Pomieszczenie, Nazwa, DataGodzina from swiatlo where Nr = 1";
$stan = "SELECT Stan from swiatlo WHERE Nr = 1";
$res = $conn-> query($stan);
$result = $conn-> query($sql);
if ($result->num_rows > 0) {
	while($row = $result-> fetch_assoc()){

		if($res == 0){
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><button class=\"btn btn-success\">ON</button></td></tr>";
		}
		else if ($res == 1){
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><button class=\"btn btn-danger\">OFF</button></td></tr>";
		}
	}
	echo "</table></div>";
}
else{
	echo "0";
}

?>
3

$res to nie jest liczba, więc nie będzie nigdy 0. Jak już coś to $res->fetch_assoc()['Stan'].

0

A jeszcze jedno pytanie. W jaki sposób mogę updatować rekordy za pomocą kliknięcia Buttona ON lub OFF? Klikając button ON chcę wysłać wartość 1 to do kolumny Stan oraz datę zaminy tej wartości.

<html>
<head>
	<title>Inteligentny dom</title>
	<link rel="stylesheet" href="style.css">
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<!--NAV MENU-->

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
	<a class="navbar-brand" href="#">Inteligentny dom interfejs</a>
	<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#basicExampleNav"
	aria-controls="basicExampleNav" aria-expanded="false" aria-label="Toggle navigation">
	<span class="navbar-toggler-icon"></span>
	</button>
	<div class="collapse navbar-collapse" id="basicExampleNav">
	<ul class="navbar-nav ml-auto text-center">
	<li class="nav-item dropdown">
		<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown"
			aria-haspopup="true" aria-expanded="false">Światło</a>
		<div class="dropdown-menu dropdown-primary text-center" aria-labelledby="navbarDropdownMenuLink">
			<a class="dropdown-item" href="index.php">Poziom 1 (wizualizacja)</a>
			<a class="dropdown-item" href="swiatlo2.php">Poziom 2 (konfiguracja)</a>
		</div>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Gniazdka</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Temperatura</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Brama garażowa</a>
		</li>
	</ul>
	</div>
</nav>
<!--NAV MENU-->

<div class="table_data table-responsive">	
	<table id="mytable" class="table table-bordered">
		<thead>
			<tr>
			<th scope="col">Obszar</th>
			<th scope="col">Poziom</th>
			<th scope="col">Pomieszczenie</th>
			<th scope="col">Nazwa</th>
			<th class="bg-warning"scope="col">Zmiana stanu portu
			<select class="filter select" data-col="2">
						<option value="">Pokaż wszystkie</option>
						<option value="1">ON</option>
						<option value="2">OFF</option>
				</select>
			</th>
			</tr>
		</thead>
		<tbody id="tbody">
			
		</tbody>

	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script type="text/javascript">
		$(document).ready(function() {
			setInterval(function () {
				$('#tbody').load('fetching-data-generator.php');
			}, 2000);
		});
	</script>
	<script src="sorting.js"></script>

</body>

</html>

<?php
include 'connect.php';

$sql = "SELECT Obszar, Poziom, Pomieszczenie, Nazwa from swiatlo";
$stan = "SELECT Stan from swiatlo";
$res = $conn-> query($stan);
$result = $conn-> query($sql);
if ($result->num_rows > 0) {
	while($row = $result-> fetch_assoc()){

		if($res->fetch_assoc()['Stan'] == 0){
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><button class=\"btn btn-success\">ON</button></td></tr>";
		}
		else {
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><button class=\"btn btn-danger\">OFF</button></td></tr>";
		}
	}
	echo "</table></div>";
}
else{
	echo "0";
}

?>

screenshot-20201203105029.png

screenshot-20201203105051.png

Z góry dzięki!!

1

Powinieneś stworzyć plik/controller/zasób PHP (nie wiem jak to masz u siebie), który przyjmuje parameter który jest nową wartością oraz id (u Ciebie pewnie 1) i robi SQL'owy UPDATE.
Następnie powinieneś jakoś wywołać ten plik/zasób ze swojego widoku, albo wysłać formularz albo Ajax.

0

Hmm ok znalzłem właśnie taki snippet kod, czy taki by zadział? Rozumiem, że Buttony muszę osadzić w <form>

$('.button').click(function() {
  $.ajax({
    type: "POST",
    url: "some.php",
    data: { name: "John" }
  }).done(function( msg ) {
    alert( "Data Saved: " + msg );
  });
});
<?php
    function abc($name){
        // update query
    }
?>
1
klawikos napisał(a):

Hmm ok znalzłem właśnie taki snippet kod, czy taki by zadział? Rozumiem, że Buttony muszę osadzić w <form>

Nie, jedno albo drugie. <form> potrzebujesz jeśli chcesz submitować formularz i przeładowawć stronę. Używając Ajaxa nie musisz nic zmieniać.

To wygląda ok:

$('.button').click(function() {
  $.ajax({
    type: "POST",
    url: "some.php",
    data: { name: "John" }
  }).done(function( msg ) {
    alert( "Data Saved: " + msg );
  });
});

To nie zadziała, tak po prostu.

<?php
    function abc($name){
        // update query
    }
?>

Prędzej:

<?php
$name = $_POST['name'];

albo

<?php
    function abc($name){
        // update query
    }
    
    abc($_POST['name']);
0

Poprawiłem troche kod i dodalem testowy button, ale po kliknieciu buttonu nic sie nie dzieje. W czy moze byc problem?

<html>
<head>
	<title>Inteligentny dom</title>
	<link rel="stylesheet" href="style.css">
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<!--NAV MENU-->

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
	<a class="navbar-brand" href="#">Inteligentny dom interfejs</a>
	<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#basicExampleNav"
	aria-controls="basicExampleNav" aria-expanded="false" aria-label="Toggle navigation">
	<span class="navbar-toggler-icon"></span>
	</button>
	<div class="collapse navbar-collapse" id="basicExampleNav">
	<ul class="navbar-nav ml-auto text-center">
	<li class="nav-item dropdown">
		<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown"
			aria-haspopup="true" aria-expanded="false">Światło</a>
		<div class="dropdown-menu dropdown-primary text-center" aria-labelledby="navbarDropdownMenuLink">
			<a class="dropdown-item" href="index.php">Poziom 1 (wizualizacja)</a>
			<a class="dropdown-item" href="swiatlo2.php">Poziom 2 (konfiguracja)</a>
		</div>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Gniazdka</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Temperatura</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Brama garażowa</a>
		</li>
	</ul>
	</div>
</nav>
<!--NAV MENU-->

<div class="table_data table-responsive">	
	<table id="mytable" class="table table-bordered">
		<thead>
			<tr>
			<th scope="col">Obszar</th>
			<th scope="col">Poziom</th>
			<th scope="col">Pomieszczenie</th>
			<th scope="col">Nazwa</th>
			<th class="bg-warning"scope="col">Zmiana stanu portu
			<select class="filter select" data-col="2">
						<option value="">Pokaż wszystkie</option>
						<option value="1">ON</option>
						<option value="2">OFF</option>
				</select>
			</th>
			</tr>
		</thead>
		<tbody id="tbody">
			<button class="btn" name="button" value="1">VALUE 1</button>
		</tbody>

	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script type="text/javascript">
		$(document).ready(function() {
			$('.btn').click(function(){
				var button = $(this).val();
				$.ajax({ 
				url: "query.php",
				type: "POST",
				data: {
					button: button,
				},
				success: function (data) {
					alert(button);
				}
			}); 
		});

			setInterval(function () {
				$('#tbody').load('fetching-data-generator.php');
			}, 2000);
		});

		
	</script>
</body>

</html>

<?php
include 'connect.php';
$stan = 1;
if(isset($_POST['button'])){
    $stan = $_POST['button'];
    $udpate = "UPDATE swiatlo SET Stan = $stan WHERE Nr = 1";
    $queryupt = mysqli_query($conn, $update);

}else{
    echo "err";
}

?>
1
klawikos napisał(a):

Poprawiłem troche kod i dodalem testowy button, ale po kliknieciu buttonu nic sie nie dzieje.

To że nic nie zauważasz, nie znaczy że nic się nie dzieje. Musisz ustalić Cz $() łapie przycisk, czy zapina się event handler, czy handler odpala kiedy klikasz w przycisk, czy handler próbuje zrobić request, czy request trafia do servera/backendu, czy zwraca poprawny wynik (chociaż u Ciebie to i tak jest "" albo "err").

W czy moze byc problem?

Otwórz narzędzia developerskie w swojej przeglądarce i zobacz co się dzieje w Console oraz Network.

0

Poprawiłem, już przycisk działa, tylko w dziwny sposób - klikam w button, ale klikać parę razy zanim zaskoczy button. Pewnie przez setInterval, tylko nwm jak umieścić te funkcję, aby działało poprawnie. Mógłby ktoś spojrzeć na ten kod?
index.php

<html>
<head>
	<title>Inteligentny dom</title>
	<link rel="stylesheet" href="style.css">
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<!--NAV MENU-->

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
	<a class="navbar-brand" href="#">Inteligentny dom interfejs</a>
	<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#basicExampleNav"
	aria-controls="basicExampleNav" aria-expanded="false" aria-label="Toggle navigation">
	<span class="navbar-toggler-icon"></span>
	</button>
	<div class="collapse navbar-collapse" id="basicExampleNav">
	<ul class="navbar-nav ml-auto text-center">
	<li class="nav-item dropdown">
		<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown"
			aria-haspopup="true" aria-expanded="false">Światło</a>
		<div class="dropdown-menu dropdown-primary text-center" aria-labelledby="navbarDropdownMenuLink">
			<a class="dropdown-item" href="index.php">Poziom 1 (wizualizacja)</a>
			<a class="dropdown-item" href="swiatlo2.php">Poziom 2 (konfiguracja)</a>
		</div>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Gniazdka</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Temperatura</a>
		</li>
		<li class="nav-item">
		<a class="nav-link" href="#">Brama garażowa</a>
		</li>
	</ul>
	</div>
</nav>
<!--NAV MENU-->

<div class="table_data table-responsive">	
	<table id="mytable" class="table table-bordered">
		<thead>
			<tr>
			<th scope="col">Obszar</th>
			<th scope="col">Poziom</th>
			<th scope="col">Pomieszczenie</th>
			<th scope="col">Nazwa</th>
			<th class="bg-warning"scope="col">Zmiana stanu portu
			<select class="filter select" data-col="2">
						<option value="">Pokaż wszystkie</option>
						<option value="1">ON</option>
						<option value="2">OFF</option>
				</select>
			</th>
			</tr>
		</thead>
		<tbody id="tbody">
			<button class="btn">CLICK</button>
		</tbody>

	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script type="text/javascript">
		$(document).ready(function() {
			setInterval(function () {
				$('#tbody').load('fetching-data-generator.php');
			}, 2000);
		});

		function myFunction(){
			$('.btn').click(function() {
			var button = $(this).val();
			$.ajax({
				type: "POST",
				url: 'query.php',
				data: {button},
				success: function(){
				console.log("ok");
				}
				});	
			});	
		}
	</script>
</body>

</html>

query.php

<?php
    include 'connect.php';


    if(isset($_POST["button"])){
            $stan = "SELECT Stan FROM swiatlo WHERE Nr = 1";
            $res = $conn-> query($stan);
            $stan2 = (int) !$res;
            $upt = "UPDATE swiatlo SET Stan = $stan2 WHERE Nr = 1";
            $conn->query($upt);
    }

?>

fetching-data-generator.php

<?php
include 'connect.php';

$sql = "SELECT Obszar, Poziom, Pomieszczenie, Nazwa from swiatlo";
$stan = "SELECT Stan from swiatlo";
$res = $conn-> query($stan);
$result = $conn-> query($sql);
if ($result->num_rows > 0) {
	while($row = $result-> fetch_assoc()){

		if($res->fetch_assoc()['Stan'] == 0){
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><img src=\"off.svg\" class=\"light\" style=\"width:40px;\"><button class=\"btn btn-success\">ON</button></td></tr>";
		}
		else {
			echo "<tr><td>".$row["Obszar"]."</td><td>".$row["Poziom"]."</td><td>".$row["Pomieszczenie"]."</td><td>".$row["Nazwa"]."</td><td><img src=\"on.svg\" class=\"light\" style=\"width:40px;\"><button onclick = \"myFunction()\" class=\"btn btn-danger\">OFF</button></td></tr>";
		}
	}
	echo "</table></div>";
}
else{
	echo "0";
}

?>
5

A dlaczego w ogóle używasz do tego setInterval? Co chcesz osiągnąć?

0

To ma symulować stan rzeczywisty funkcjonowania świateł w domu, więc ostawiłem automatyczne odświeżanie wartości z bazy na co 2 sekundy.

1

Wszystko jest, źle i do wyrzucenia

$sql = "SELECT Obszar, Poziom, Pomieszczenie, Nazwa from swiatlo";
$stan = "SELECT Stan from swiatlo";

przeciez Stan mozesz wyjac w pierwszym wierszu po co to rozdzielac ?
Zacznij od nowa po kolei masz zrobić tak:

  1. Tabele o nazwach:
    a) zones - obszar (id, symbol, public_name) lub jesli to uzytkownik ma wpisywac to (id, id_user, symbol, public_name)
    b) levels - poziom (id, symbol, public_name) lub jesli to uzytkownik ma wpisywac to (id, id_user, symbol, public_name)
    c ) rooms - pomieszczenie (id, symbol, public_name) lub jesli to uzytkownik ma wpisywac to (id, id_user, symbol, public_name)
    d) room_names (id, room_symbol, public_name) - room_symbol prowadzi do tabeli wyzej
    e) lights (id, zone_symbol, level_symbol, room_symbol, status) - dodajesz symbole a status okresla siwatlo wlaczone lub wylaczone

  2. Robisz guzik button bez zadnego FORM sam guik goly z klasa

<button class="light-switch" data-light_id="wstawiasz tu id z tabeli lights" data-light_status="tu wstaiwasz status z tabeli light">GUZIK</a>
  1. W JS robisz zdarzenie on click które wydarza się na light-switch i pobiera light_status
    $('.light-switch').on('click', function() {
    w zmiennej $(this).data('light_id'); masz ktory rekord zmienic
    w zmiennej $(this).data('light_status'); masz obecny status swiatla
    runAjax('url', {id_light: $(this).data('light_id'), status: $(this).data('light_status')}, refresh_button);
    });

  2. Robisz jedna funkcje w skrypcie JS

function runAjax(url, datum, callback) {  
    $.ajax({
        type: 'POST',
        url: '/ajax/' + url,
        data: datum,
        dataType: 'json',
        success: function (data) {
            callback(data);
            return true;
        },
        error: function (data) {
            console.log('ajax error', data);
        }
    });
}
  1. dodajesz w JS funkcje
function refresh_button(data) {
to co ci zwroci plik ktory wykona zaswiecenei lub zgaszenie swiatla i wtedy podmieniasz w guzki nie obrazek a klase
w klasie css  masz dac obrazki na guzik ON lub OFF
}
  1. Dopiero jak to zadziala to wyjmujesz dane ztabeli i pokazujesz juz to co chcesz pokazac jak zadziala ci glowny core
1

A odnośnie tego setInterval to zobacz jak działa clearInterval() https://www.w3schools.com/js/js_timing.asp

0

Dzięki @chomikowski: tylko właśnie chodzi o to, że muszę mieć 1 tabele gdzie mam wszystko. Nie ma bardzo rozumiem, w którym punkcie ja odnoszę się do bazy danych. Graficznie u mnie tak to powinno wyglądać.
screenshot-20201205125630.png

@jurek1980: Nwm czy clearInterval mi tu pomoże, bo gdy zatrzymam setInterval, to już będzie koniec wczytywania danych, a chce je wczytywać co 2 sekundy.

Nie działają mi przyciski chyba z tego powodu, że js wczytuje się dopiero na koniec ładowania strony, a php generuje mi się wcześniej.

0

Wydaje mi się, że powinieneś:

  • Wywołać generalnie setInterval
  • w przypadku wciśnięcia przycisku przerwać działanie setInterval
  • po otrzymaniu odpowiedzi przez AJAX podmienić tylko edytowany wiersz w HTMLu ( odpowiedzią mogą być od razu właściwe wartości do przeładowania)
  • uruchomić ponownie setInterval żeby coś robić okresowo
    Musisz natomiast sam wymyśleć jak logicznie to powinno u Ciebie działać i jaką masz wizję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1