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?
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 } }
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.
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); } }
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?
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" />
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ää.
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,
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.
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.
Voit esimerkiksi välittää functiolle tallennaTiedot() buttonissa formin id:n jonka perusteella kyseisen formin sisällä olevat inputit lähetetään eteenpäin.
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?
Ä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>
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.
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 :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.