Visa mysqldata i textbox efter val från select box option value?
Jag har en tabell i mysql som heter element och jag jobbar på ett skript att använda för att uppdatera data för existerande element och för att lägga till nya element med beskrivning. Ett exempel på tabellen.
id name description
1 a Beskrivning för a
2 b Beskrivning för b
3 c Beskrivning för c
Min PHP-fil har en select box, ett textfält, en textbox och en submitknapp. I textfältet skriver jag in nya element som jag vill lägga till i tabellen och select boxen listar elementen som redan finns i tabellen. När jag trycker på submit läggs ett nytt element till om jag skrivit något i textfältet. Om textfältet är tomt och jag väljer ett element i select boxen i stället, uppdateras beskrivningen för det elementet. Om både select box och textfält är tomma, visas ett meddelande: "Inga element valda".
Allt detta fungerar, men jag vill också att beskrivningen för varje element ska visas i textboxen, så att jag kan redigera den, inte skriva en ny och radera texten som redan är skriven. Jag har kommit på hur jag får den tidigare skrivna texten som ligger i databasen att visas i textboxen och detta är koden:
function description(){
set_utf8();
$result=mysql_query("SELECT * from element WHERE name='a'") or die(mysql_error()); //onselect $name
$row=mysql_fetch_array($result);
echo $row['description'];
}
Om jag bara hade tre element som exempeltabellen ovan, hade jag kunnat använda den här funktionen med en if-sats, men eftersom jag lägger till nya element hela tiden, skulle det inte fungera. Jag behöver en funktion som lägger elementet jag väljer från select boxen i en variabel, så att jag kan använda den variabeln i stället för 'a' i ovanstående funktion. Problemet är att jag inte vet hur man gör det. Vanligtvis brukar jag klura ut hur jag ska lösa den här typen av problem eller finna en väg runt det, men den här gången är jag helt ställd.
Jag har några filer, men för enkelhetens skull, har lagt allt i samma fil. Här är koden:
<?php
/*##############################################################
Connects to the database. The configuration file only
holds the variables for the connection.
##############################################################*/
include('config.php');
mysql_connect($db_host, $db_user, $db_password) or die(mysql_error());
mysql_select_db($db_database) or die(mysql_error());
/*##############################################################
To get rid of the strange characters when å, ä and ö is
used.
##############################################################*/
function set_utf8(){
mysql_query("SET NAMES 'utf8'") or die(mysql_error());
mysql_query("SET CHARACTER SET 'utf8'") or die(mysql_error());
}
/*##############################################################
Updating or adding and element with description.
##############################################################*/
//Update
if($_POST['submit'] && !$_POST['name'] && $_POST['element_retrieve']){
$name = $_POST['element_retrieve'];
$description = nl2br($_POST['description']);
set_utf8();
mysql_query("UPDATE element SET description='$description' WHERE name='$name'") or die(mysql_error());
echo "Data inserted";
}
//Add
else if($_POST['submit'] && $_POST['name']){
$name = $_POST['name'];
$description = $_POST['description'];
set_utf8();
mysql_query("INSERT INTO element (name, description) VALUES('$name', '$description')") or die(mysql_error());
echo "Data inserted";
}
//Both the textfield and the selectbox is empty.
else if($_POST['submit'] && !$_POST['name'] && !$_POST['element_retrieve']){
echo 'No element chosen';
}
/*##############################################################
Trying to retrieve the description from the elements and
echo it in the textarea box.
##############################################################*/
function description(){
set_utf8();
$result=mysql_query("SELECT * from element WHERE name='a'") or die(mysql_error()); //onselect $name
$row=mysql_fetch_array($result);
echo $row['description'];
}
?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Lägga till data i databas</title>
</head>
<body>
<form method="post" action="test.php">
<?php
//A selectbox with elements in the table element i database;
echo 'Choose an element: <select name="element_retrieve"><option value="" selected="selected"></option>';
$result=mysql_query("SELECT * from element") or die(mysql_error());
while($row=mysql_fetch_array($result)){
echo '<option>';
echo $row['name']."<br>";
}
echo "</option></select>";
?>
or create a new element: <input type="text" name="name"><br><br>
Description:<br>
<textarea name="description"><?php description(); ?></textarea><br>
<input type="submit" value="Send" name="submit">
</form>
</body>
</html>
Tillagt i detta inlägg:
Antagligen är jag väldigt omständig när jag försöker få till en lösning, men med nedanstående ändringar har jag lyckats att få beskrivningen för aktuellt element att dyka upp i textboxen. Problemet är att aktuellt element inte är valt längre, så jag måste välja det en gång till innan jag kan skicka iväg det till databasen.
Till att börja med har jag valt att dela funktionen add_update_element till två, add_element och update_element. Den första ser ut som tidigare, förutom att funktion numera bara heter add_element():
function add_element(){
//Lägga till element
if($_POST['insert_element'] && $_POST['name']){
$name = $_POST['name'];
$description = $_POST['description'];
set_utf8();
mysql_query("INSERT INTO element
(name, description) VALUES('$name', '$description')")
or die(mysql_error());
echo "Data tillagt";
}
//Inget element valt eller tillagt
else if($_POST['insert_element'] && !$_POST['name']){
echo "Du har inte valt eller skapat något element!<br><br>";
echo '<a href="#" onClick="history.go(-1)">Gå tillbaka</a><br><br>';
}
}
När det gäller uppdatering av redan befintliga element, har jag i stället valt en annan väg. Först lägger jag till en ny submit-knapp som jag kallar för edit_element. När jag har valt ett element i listan och trycker på edit_element, kallar jag på funktionen edit_element():
function edit_element(){
if($_POST['edit_element'] && !$_POST['element_retrieve']){
echo 'Element not chosen';
}
else
if($_POST['edit_element'] && $_POST['element_retrieve']){
$name = $_POST['element_retrieve'];
set_utf8();
$result=mysql_query("SELECT * from element WHERE name='$name'") or die(mysql_error());
while($row=mysql_fetch_array($result)){
echo '<input type="submit" value="Uppdatera" name="update_submit">';
}
}
}
Förutom att denna funktionen lägger till beskrivningen för det valda elementet i textboxen, lägger den till en ny knapp, update_element. Att den knappen dyker upp först efter att jag har valt ett element och tryckt på redigera-knappen, är för att jag inte vill riskera att trycka på uppdatera innan så att tidigare skriven beskrivning går förlorad:
function update_element(){
//Uppdatera element
if($_POST['update_submit'] && $_POST['element_retrieve']){
$name = $_POST['element_retrieve'];
$description = nl2br($_POST['description']);
set_utf8();
mysql_query("UPDATE element SET description='$description' WHERE name='$name'")
or die(mysql_error());
echo "Data tillagt";
}
//Inget element valt eller tillagt
else if($_POST['update_submit'] && !$_POST['element_retrieve']){
echo "Du har inte valt eller skapat något element!<br><br>";
echo '<a href="#" onClick="history.go(-1)">Gå tillbaka</a><br><br>';
}
}
Sedan har jag ändrat funktionen description() till:
function description(){
if($_POST['edit_element'] && !$_POST['element_retrieve']){
echo 'Element not chosen';
}
else
if($_POST['edit_element'] && $_POST['element_retrieve']){
$name = $_POST['element_retrieve'];
set_utf8();
$result=mysql_query("SELECT * from element WHERE name='$name'") or die(mysql_error());
while($row=mysql_fetch_array($result)){
echo $row['description'];
}
}
}
Jag har också lagt in värden för value i option på select boxen:
function select_element(){
echo 'Välj element: <select name="element_retrieve"><option value="" selected="selected"></option>';
$result=mysql_query("SELECT * from element") or die(mysql_error());
while($row=mysql_fetch_array($result)){
echo '<option value="';
echo $row['name'];
echo '">';
echo $row['name']."<br>";
}
echo "</option></select>";
}
Problemet som kvarstår är att när jag trycker på redigera så uppdateras textboxen med beskrivningen av valt element, men i stället är inte elementet i select boxen vald längre, så jag måste välja den en gång till. Den kommer alltså inte ihåg det valda värdet efter submit och jag antar att det är sessions som är enda lösningen?