ugrás a tartalomhoz

PHP-AJAX-PHP form/submit

Anonymus04 · 2017. Május. 9. (K), 21.40
Szervusztok!
Egy profil adatmódosító lapot csinálok az oldalamhoz. A lapon beolvasom a felhasználó képeit, ezeket radioButton-ként használom. Amikor a júzer ráklikkel az egyik képre meghívódik egy ajax függvény (továbbküldve a kép id-ját és a nevét), ami meghívja a keres.php fájlt. A keres.php fájlban van egy form, amiben inputokba olvasom be a kép adatait adatbázisból, van egy mentés és egy törlés gomb.
Jelenleg még csak ott tartok, hogy minden adat szépen megjelenik, ahogy a képekre kattintgatok, de a törlés gombra kattintva a törlés nem fut le. Mintha semmi nem történne csak az AJAX kérés megszűnik
Egy kicsit számomra is furának tűnik a dolog, de amennyiben megoldható a dolog, nem tudom hol lehet a hiba? Valaki esetleg tudna segíteni?
Előre is köszönöm szépen!


profiladatmodosit.php

<?php
header("Content-Type:text/html; charset=utf-8");
include('pages/DB_Connect.php');
?>
<!DOCTYPE html>
<html>
<head>

	<script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.js"></script>
	<script type="text/javascript">
	//<![CDATA[
	function adat_olvas(akt_id, picName)
	{
		$.ajax({method: 'POST', url: "keres_adat.php?id="+akt_id+"&pic="+picName, success: function(result)
			{
				$("#a_data").html( result );
			}
		});
	}
	//]]>
	</script>
	<style>
	label > input{ /* HIDE RADIO */
		visibility: hidden; /* Makes input not-clickable */
		position: absolute; /* Remove input from document flow */
	}
	label > input + img{ /* IMAGE STYLES */
		  cursor:pointer;
		  border:2px solid transparent;
	}
	label > input:checked + img{ /* (RADIO CHECKED) IMAGE STYLES */
		border:2px solid #f00;
	}
	</style>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

	<title>RadioButtonsWithImages</title>
</head>
<body>

	<?php
	$kvtnev = "pages/profiles/Admin";
	if (is_dir($kvtnev))
	{
		$kvt = opendir ($kvtnev);
		while (gettype($fajl = readdir($kvt)) != boolean)
		{
			if (is_file($kvtnev."/".$fajl))
			{
				$lista[] = $fajl;
			}
		}
		closedir($kvt);
	}
	$usId=2;
	$sqlK = mysql_query("SELECT * FROM images WHERE user_id = '$usId'");
	while($row = mysql_fetch_array($sqlK))
	{
		echo "<label>";
		echo "<input type='radio' name='fb' value='$row[6]' />";
		?>
		<img width='100px' height='100px' onclick="adat_olvas(<?php echo $row[0].",'".$row[1]."'";?>)" src='pages/profiles/Admin/temp/<?php echo $row[1]; ?>'>
		<?php
		echo "</label>";
	}
	
	?>
	<div id="a_data"></div>
	<br><br><a href="http://jsbin.com/image-instead-of-radio-button/5/edit?html,css,output" >Link to RadioButtonsWithImages for examples</a>
</body>
</html>
keres.php

<?php
header('Content-Type:text/html; charset=utf-8');
include("pages/DB_Connect.php");
$Id = $_GET['id'];
$picName = $_GET['pic'];

if(isset($_POST['deletPicture']))
{
	$file = "pages/profiles/Admin/";
	if(is_file($file.$picName))
	{
		if (!unlink($file.$picName))
		{
			echo ("Error deleting $file.$picName");
		}
		else
		{
			echo ("Deleted $file.$picName");
		}
	}
	else
	echo "Nem létezik a fájl!";
}
else
{
	echo "nincs";
}

$qry_1=mysql_query("SELECT * FROM images WHERE id='$Id'");
while($row1 = mysql_fetch_array($qry_1))
{
	?>
	<form method="post">
		<textarea name="leiras"><? echo $row1[3]; ?></textarea><br>
		<input type="hidden" name="hidden_id" value="<?echo $row1[0]?>"/>
		<input type="radio" name="pubpriv" value="1"<? if($row1[4]=='1') {echo "checked='checked'";} ?> />privát
		<input type="radio" name="pubpriv" value="0"<? if($row1[4]=='0') {echo "checked='checked'";} ?> />publikus
		<input type="checkbox" name="profile" value="1"<? if($row1[2]=="1"){ echo "checked"; } ?> />Profilkép
		<input type="submit" name="saveDatas" value="Változások mentése"/>
		<input type="submit" name="deletPicture" value="Törlés"/>
	</form>
<?php 
}

?>
 
2

Hibák

Hidvégi Gábor · 2017. Május. 10. (Sze), 08.52
A példakódjaidban gyakorlatilag minden hibát elkövettél, amit lehet : )

Sajnos ez is csak arra mutat, hogy az internet decentralizáltsága bár részben előny, de elég nagy hátrány is, így nehéz olyan információforrást találni, ahol leírják, hogyan célszerű programozni, mire kell figyelni.
3

Javaslatok

Hidvégi Gábor · 2017. Május. 10. (Sze), 09.01
Első körben felejtsd el az Ajaxot, és tedd rendbe a kódot!

  • írj egy külön adatbáziskezelő modult, ami mondjuk tömbben adja vissza a lekérdezések eredményeit
  • mysqli kezdetű függvényeket használj
  • Minden olyan PHP kód, ami az adatok feldolgozásáért felel, legyen a fejlécben, még mielőtt bármilyen HTML kódot kiírnál - így, ha hiba történik, azt intelligensen meg tudod jeleníteni, nem pedig az oldal közepén derül ki, hogy hibásan írtál meg egy lekérdezést
  • ez egy nagyobb falat: csinálj normális hibakezelést, azaz egy változóba tedd bele, ha hiba történt, és ne fusson tovább a kód, hanem jelenítsd meg a hibaüzenetet
  • készítsd el a kódot javascript nélkül, ha úgy hibátlanul működik, utána "díszítsd fel"
4

Köszönöm, megfogadom a javaslatokat

Anonymus04 · 2017. Május. 10. (Sze), 11.23
Köszönöm, megfogadom a javaslatokat!
Igaz közbe sikerül egy kis példán keresztül megoldanom. Elég jól működik is. (Persze nem a javaslatai alapján csináltam, de most már figyelembe veszem, és átalakítom az összes kódom úgy! Köszönöm!)
Illetve mit jelent az, hogy a PHP kód, ami az adatok feldolgozásáért felel, legyen a fejlécben?

(Annyi gondom lenne, ha esetleg ebben tudna segíteni valaki, hogy ha sikeres a törlés frissítem az oldalt. Egy atw-s ingyenes tárhelyen szoktam tesztelni, és bármilyen frissítést alkalmazok, frissítéskor a frame(oldal tetején lévő reklám) a frame-ben jelenik meg. Ahányszor frissitem az oldalt annyiszor ágyazza egymásba az oldalt. Az érdekelne, hogy ez csak itt az atw-n egy átok, vagy valamit rosszul csinálok? Köszönöm, az esetleges segítséget!)

TesztModul
5

Fejléc

Hidvégi Gábor · 2017. Május. 10. (Sze), 11.32
Nagyjából így kéne kinéznie a PHP fájlnak:
<?php
  include('szukseges.php');

  $hibauzenet = null;

  //bejövő adatok ellenőrzése, feldolgozása
  if (isset($_POST['akármi']) and $_POST['akármi'] == 'valami') {
    //1. ellenőrzünk
    //2. elmentjük az adatokat
    //3. ha volt bármilyen hiba, $hibauzenet = 'hiba volt';
  }

  //adatok összegyűjtése
  $menu = menu_beolvasasa();
  $tartalom = tartalom_osszeallitasa();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...
<html>
<body>
<?php
  menu_kirajzolása($menu);
  if ($hibauzenet !== null) {
    hibauzenet_kiirasa($hibauzenet);
  }
  tartalom_kirajzolasa($tartalom);
?>
</body>
</html>
6

jujj

Pepita · 2017. Május. 12. (P), 12.21
Szeretjük a notice szintű hibákat? :)
if ($hibauzenet !== null) feltétel helyett if (isset($hibauzenet)) és kb 5x gyorsabb a futás, mert kimarad belőle az error_handler (ez ugye akkor is lefut, ha el van nyomva a hiba).

Egyébiránt ez a megoldás arra jó, hogy szét legyen darabolva a spagetti kód több, rövidebb részre, de önmagában az átláthatóságot nem növeli.
Kezdő lépésnek "elmegy" az újrahasznosíthatóság felé, de nagyon be lehet menni így az erdőbe.

Alapvetően nem egy jó irány (funkcionális, include ide - include onnan, ...).
7

Fuss neki még egyszer

Hidvégi Gábor · 2017. Május. 12. (P), 14.35
A kódom nem fog notice-t dobni, ha átnézed még egyszer, rájössz, hogy miért.

Nem kívántam teljes megoldást adni, csak egy vázat, majd a kérdező kifőzi magának a saját levesét.

A kódban semmilyen funkcionális nincs, az include-okkal pedig nincs semmilyen gond, te is használod őket.