Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedon lähetys Ajax,php,sql

Sivun loppuun

faaraot [11.03.2011 14:30:12]

#

Ongelmana on syöttää lisaa.php:lle oikeat tiedot. Vähän vaikea selittää mutta yritän. Eli on haettu tietokannasta tiedot tuote ja maara. Sitten ne pitäs tallentaa tietokantaan omiin tietoihin.

Eli seuraava koodi hakee tiedot ja jos kyselyn vastauksena on yksi rivi, saan sen tallennettua tietokantaan, mutta jos kyselyssä tulee kaksi riviä niin se tallentaa vain ensimmäisen rivin tiedot. Functiot on ajaxfunctioita, koska se näköjään vain muuttaa tiettyä osaa sivusta, eli jos lisää tai poistaa niin se tapahtuu realiajassa eikä tartte koko sivua päivittää. Eli en saa noita arvoja siirtymään lähetä jutussa oikeana.

while($row = mysql_fetch_array($result)) {
$tuote = $row['tuote'];
$maara = $row['maara'];


?>
<form 'testi'>
<table width="361" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="49"><? echo $tuote; ?></td>
    <td width="75"><input type='text' id='maara' value='' size="2" />min</td>
    <td width="237">

    <input type='hidden' id='tuote' value='<? echo $tuote; ?>' size="1" >

<img src="lisaa.png" onclick='ajaxfunction(), ajacfunction2()' value='lisaa' /></td>

   </tr>
</table>
<p>-----------</p>
</form>

<?

}
?>

Ajax hakee tiedot (tekee se muutakin kivaa samalla) ja pukkaa ne lisaa.php:lle

$tuote = $_GET["tuote"];
$maara = $_GET["maara"];


$sql2= "INSERT INTO asiakastuote (tuote, maara) values ('$tuote','$maara')";

$result2 = mysql_query($sql2, $con);

?>

Sen verran selvittänyt että tieto tuolla formissa ei siirrt eteenpäin kun on php ja echo juttu.

Eli kun painan lähetän se syöttää luonnollisesti vain viimeksi annetut tiedot. Eli miten saisin tiedoista tehtyä vaikka moduuleja tai jotain?

Othnos [11.03.2011 17:05:26]

#

Tervehdys faaraot.

Sinun pitää lähettää jokainen kenttä erikseen esimerkiksi taulukossa.

Väsäsin lyhyen esimerkin joka käyttää jQuery-javascript kirjastoa.

tiedonlahetys.php

<?php
$tuotteet = array(
	0 => array('nimi' => 'Tuote1', 'maara' => '1'),
	1 => array('nimi' => 'Tuote2', 'maara' => '2'),
	2 => array('nimi' => 'Tuote3', 'maara' => '3')
);

?><!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<script type="text/javascript" src="javascript/jquery-1.5.1.js"></script>
	<script type="text/javascript">
	function tallennaTiedot() {
		tuotteet = new Object;

		jQuery.each($("#tuotteet input").serializeArray(), function(i, tuote){
			tuotteet[tuote.name] = tuote.value;
		});

		$.ajax({
			type: "POST",
			url: "tallennatiedot.php",
			data: $.param(tuotteet),
			success: function(html){
				$("#tila").html(html);
			}
		});
	};
	</script>
    <style type="text/css"></style>
    <title>Tiedon lähetys</title>
</head>

<body>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<div id="tuotteet">
<?php
foreach ($tuotteet as $tunniste => $tuote) {
	?>
	<p>
	Tuote: <input type="text" name="tuotenimi[<?php echo $tunniste; ?>]" value="<?php echo $tuote['nimi']; ?>" /><br />
	Määrä: <input type="text" name="tuotemaara[<?php echo $tunniste; ?>]" value="<?php echo $tuote['maara']; ?>" />
	</p>
	<?php
}
?>
</div>
<p><input type="button" onclick="tallennaTiedot()" value="Tallenna" /></p>
</form>
<div id="tila"></div>
</body>
</html>

tallennatiedot.php

<?php
if (isset($_POST['tuotenimi']) && isset($_POST['tuotemaara'])) {
	foreach($_POST['tuotenimi'] as $tunniste => $tuote) {
		?>
		<p>
		Tuote: <?php echo htmlspecialchars($tuote); ?><br/>
		Määrä: <?php if (isset($_POST['tuotemaara'][$tunniste])) echo htmlspecialchars($_POST['tuotemaara'][$tunniste]); ?>
		</p>
		<?php
	}
}

Esimerkki koodi

Muista myös tarkistaa käyttäjän syöte ennen tietokantaan tallentamista ajamalla se mysql_real_escape_string-funktion lävitse, sekä tulostuksessa htmlspecialchars-funktion lävitse.

The Alchemist [11.03.2011 18:48:45]

#

Aavistuksen siistimmät versiot alla. Tiedonlahetys.php:tä en laittanut tuohon kokonaisuudessaan. Inputeille todellakin pitää määrittää name-attribuutti, id-attribuutti ei kelpaa parametrien nimeksi.

*** tiedonlahetys.php
<div id="tuotteet">
  <form...>
  <?php
  foreach ($tuotteet as $id => $tuote) {
    printf(
      '
      <label>Tuote</label> <input type="text" name="tuotenimi[%s]" value="%s"/>
      <label>Määrä</label> <input type="text" name="tuotemaara[%s]" value="%s"/>
      ',
      $id, $tuote['nimi'],
      $id, $tuote['maara']
    );
  }
  ?>
  </form>
</div>
*** tallennatiedot.php
<?php
if (@is_array($_POST['tuotenimi'])) {
  foreach($_POST['tuotenimi'] as $id => $tuote) {
    $tuote = htmlspecialchars($tuote);
    $maara = @ctype_digit($_POST['tuotemaara'][$id]) ? $_POST['tuotemaara'][$id] : 0;

    printf("<p>Tuote: %s\nMäärä: %d</p>\n", $tuote, $maara);
  }
}

faaraot [11.03.2011 18:53:59]

#

Vähän pääsen jyvälle.

Eli mulla on sivu jossa on haku. Sieltä haetaan esim. tuotteet auto. Tulokseksi tulee esim. auto, musta / ja auto, keltainen. Siinä voi valita kumman haluaa lisätä omiin tuotteisiin. Kun lisää sen tuotteisiin, päivittyy se samalla omaan tuotelistaan, tuotelistan perässä on valinta poista.

index.php -> ajaxilla haetaan hakuvalikko.php (siellä on sql kysely, sekä haku form. -> sieltä valitaan esim se auto musta -> ajax functio ottaa formista tiedot ja pukkaa ne lisaatuote.php joka pistää ne tietokantaan.

Eli jos vähän selvennystä siihen että jos kyselyssä saadaan kaksi tuotetta, niin miten saan niistä valittua jommankumman ja pistettyä sen tietokantaa. Haluan tuota ajaxia käyttää että turhat sivunpäivitykset jäisi pois ja olisi nopiampi. Ongelmana on se että kun hakee tiedot tuosta niin miten saan tiedot juuri siitä formista. Jos tuloksena on yksirivi niin ei mitään ongelmaa, useammassa tallentaa vain viimeisen rivin tiedot, vaikka valitsisi mitä.

Pitää vielä syventyä tuohon lähettämääsi koodiin. Miten sitten jos tuotteita on sata, toimiiko?

Othnos [11.03.2011 19:05:27]

#

Suosittelen tutustumaan Ohjelmointiputkan PHP-oppaan neljänteen-osaan. Jos tälläkertaa ymmärsin oikein kyseiseen ongelmaan ratkaisu voisi olla radiobutton.

Esim.

<input type="radio" name="tuotteet" value="auto1" />
<input type="radio" name="tuotteet" value="auto2" />

faaraot [11.03.2011 19:27:32]

#

Juu tiedän ton, mutta jos laitan vaikka

a$ = "jotain tietokannasta haettua";

<input type="radio" name="tuotteet" value="<? echo $a ?>" />

niin tuo ei tuo valuen arvo ei tulostu kun hakee ne pukkaa ajaxin läpi, siis tuleehan sinne viimeisin esim a$:n arvo mutta ei juuri sitä arvoa mitä tarkoitan. Eli olen formin ja tulokset ajanut while:n läpi. että kaikki tieto mitä haetaan tulee tietokannasta esille.

Jos haussa on kolme tietoa esim. (auto,musta),(auto,keltainen)(auto,valkoinen) ja ne pitäisi saada tietokantaan, ja niitä haku tuloksia tulee vaikka kolme niin miten sitten.

Oon niin huono selittämään ja sen verran uus näissä kuvioissa että täytyypi opiskella lisää.

faaraot [12.03.2011 09:47:15]

#

Kiitos Othnos :)

Miten teet jos kuvitellaan että tuo esimerkkin ensimmäinen vaihe on että etsi, ja se tulostaa nuo kolme vastausta ja haluat valita niistä yhden ja tallentaa tietokantaa kaikkine tietoineen,

Othnos [12.03.2011 12:43:36]

#

Helpottaisi kovasti tietää tietokannan rakennetta. Helpoimmassa tapauksessa riittäisi varmaan kyseisen tuotteen id:n tallennennus asiakastuote tauluun. Kannattanee perehtyä myös Putkan MySQL ja PHP oppaaseen. Monta moneen -suhde kuulostaisi tilanteeltasi.

faaraot [12.03.2011 12:54:37]

#

Olen tuttustunut oppaisiin. Eli saan tulostettua while silmukalla tuotteet. jokaisen tulosteen perässä on lisää nappi. Mutta kun painaa lisää tuote niin se laittaa tietokantaan viimeisimmän haetun tuloksen. Eli nyt pitäisi saada button nappi joka ottaa tiedot tietystä formista. Esim. formeja tulee neljä samalle sivulle. form1n form 2, jne... onko mahdollistaa toteuttaa noin vai pitääkö tehdä jotenkin muuten.

Othnos [12.03.2011 13:40:57]

#

Voit esimerkiksi välittää functiolle tallennaTiedot() buttonissa formin id:n jonka perusteella kyseisen formin sisällä olevat inputit lähetetään eteenpäin.

faaraot [12.03.2011 15:07:25]

#

Laitoin tuossa toiseenki viesti ketjuun saman, mutta miten tässä saisin
juuri tämän formin tiedot pukattua funktiolle, jos näitä on kaksi sivulla niin viimeksi tolustettu vain lähtee. Eli miten tässä määrittelisit formin id:n functiolle ja miten siellä se osaa hakea sitten juuri oikein formin tiedot?

<? haetaan tietokannasta ja määritetään tietoa

while($row = mysql_fetch_array($result)) {

?>

<form method="post" name ='<? echo $id; ?>' >
<table width="361" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="49"><? echo $a; ?></td>
    <td width="75"><input type='text' id='a' value='' size="1" />min</td>
    <td width="100"><? echo $b; ?> </td>
    <td width="237">

<input type='hidden' id='c' value='<? echo $c; ?>' />
    <input type='hidden' id='d' value='<? echo $d; ?>' />
    <input type='hidden' id='e' value='<? echo $e; ?>' />

   <button type="button" onclick="lisaatietokantaan(), naytatiedot()">lisää tieto</button>
 </td>

   </tr>
</table>
<p>-----------</p>
</form>

<? } ?>

Seuraava koodi on javascript.

function lisaatapahtuma(){
	var ajaxRequest;  // The variable that makes Ajax possible!

	try{
		// Opera 8.0+, Firefox, Safari
		ajaxRequest = new XMLHttpRequest();
	} catch (e){
		// Internet Explorer Browsers
		try{
			ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try{
				ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e){
				// Something went wrong
				alert("Your browser broke!");
				return false;
			}
		}
	}
	// Create a function that will receive data sent from the server
	ajaxRequest.onreadystatechange = function(){
		if(ajaxRequest.readyState == 4){
			var ajaxDisplay = document.getElementById('naytatapahtuma');
			ajaxDisplay.innerHTML = ajaxRequest.responseText;
		}
	}
	var a = document.getElementById('a').value;
	var b = document.getElementById('b').value;
	var c = document.getElementById('c').value;
	var d = document.getElementById('d').value;
	var queryString = "?a=" + a + "&b=" + b + "&c=" + c + "&d=" + d;
	ajaxRequest.open("GET", "lisaatapahtuma.php" + queryString, true);
	ajaxRequest.send(null);


}

Mod. huom: Kun koodi kerran on JavaScriptia, mikset laittanut siihen JS-kooditageja?

Othnos [12.03.2011 16:39:17]

#

Äh. Olen onneton javascriptin kanssa ilman kirjastoja, mutta sain väsättyä jonkinlaisen esimerkin.

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<script type="text/javascript">
	function tallennaTiedot(formId) {
		var a = document.getElementsByName('a')[formId].value;
		var b = document.getElementsByName('b')[formId].value;
		var c = document.getElementsByName('c')[formId].value;
		var d = document.getElementsByName('d')[formId].value;

		alert("a = \"" + a +
			"\" b = \"" + b +
			"\" c = \"" + c +
			"\" d = \"" + d +
			"\"");
	};
	</script>
	<style type="text/css">
	table {
		border: 1px solid black;
	}
	</style>
    <title>Elements from form</title>
</head>

<body>
<?php
for ($i = 0; $i < 3; $i++) {
	?>
	<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
	<table>
		<tr>
			<th colspan="4">Form <?php echo $i; ?></th>
		</tr>
		<tr>
			<td><input type="text" name="a" value="a<?php echo $i; ?>" /></td>
			<td><input type="text" name="b" value="b<?php echo $i; ?>" /></td>
			<td><input type="hidden" name="c" value="hidden c<?php echo $i; ?>" /></td>
			<td><input type="hidden" name="d" value="hidden d<?php echo $i; ?>" /></td>
		</tr>
		<tr>
			<td colspan="4"><input type="button" onclick="tallennaTiedot(<?php echo $i; ?>)" value="Tallenna tiedot" /></td>
		</tr>
	</table>
	</form>
	<?php
}
?>
</body>
</html>

Esimerkki

Esimerkissä noudetaan name-attribuutin perusteella jokainen elementti ja joista oikea valitaan onclick eventissä annetun numeron perusteella. Numerot alkavat 0:sta ja välissä olevan ylimääräiset kyseisillä name-attribuuteilla olevat elementit rikkovat koodin. Joku voisi ehdottaa parempaa ratkaisua.

faaraot [12.03.2011 21:29:40]

#

Kiitokset! sain pelaamaan seuraavalla tavalla vaikka aamulla jo yritinkin sitä.
eli formin lähetykseen

onClick='laheta(this.form)'

javascriptiin

function laheta(form){

var id = form.id.value;

	ajaxRequest.open("GET", "lisaa.php" + queryString, true);
	ajaxRequest.send(null);

}

Ps. kokeilin päivällä juuri samaa ideaa että echolla annetaan nimenperään numero. No taas jotain uutta oppi :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta