简体   繁体   中英

How do I store value in my database in a dynamic dropdown list?

This is a dynamic dropdown in PHP/mySQL. I want to store the name in the database server but the tag outputs the integer value.

If i change the code from <option value="<?php echo $row["id"]; ?>"> to <option value="<?php echo $row["name"]; ?>"> It shows my_sqli_fetch_array expects parameter 1 error.

My objective being to store the corresponding $row["name"] that is being displayed on the dropdown instead of $row["id"].

<?php

$link = mysqli_connect("localhost","root", "");
mysqli_select_db($link,"loginsystem");

?>

<form name="form1" action="" method="post">
<table>
<tr>
<td>Select Assembly Line</td>
<td><select id ="assemblylinedd" onChange="change_assemblyline()">
<option>Select</option>

<?php
$i=1;
$res=mysqli_query($link, "SELECT * FROM assemblyline");
$count=mysqli_num_rows($res);
if ($count >0){
while($row=mysqli_fetch_array($res))
{
?>
<option value="<?php echo $row["id"]; ?>"><?php echo $row["name"]; ?></option>
}

<?php $i++;} }else{
echo "No record Found !";
} ?>

</select></td>
</tr>

Scripting code :

<script type="text/javascript">
function change_assemblyline()
{
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET","ajax.php?assemblyline="+document.getElementById("assemblylinedd").value, false);
    xmlhttp.send(null);
    alert(xmlhttp.responseText);
    document.getElementById("devices").innerHTML=xmlhttp.responseText;

}

This is my ajax.php

$link = mysqli_connect("localhost","root", "");
mysqli_select_db($link,"loginsystem");

$assemblyline = isset($_GET['assemblyline']) ? $_GET['assemblyline'] : '';
$devices = isset($_GET['devices']) ? $_GET['devices'] : '';


if($assemblyline!="")
{   

    $res=mysqli_query($link, "SELECT * FROM devices WHERE devices_id=$assemblyline");
    echo "<select id='devicesdd' onchange='change_devices()'>";
    while($row=mysqli_fetch_array($res))

    {

    echo "<option value='$row[id]'>";echo $row["name"]; echo "</option>";

    }
    echo "</select>";

}

Please do ignore onchange_devices() as it follows the same for next consecutive dropdown.

Though, its your requirement to save device name in DB, it is advised to save numeric id.

Reason: Name may change, but, id will persist.

If say your device id:name is 99 : iPhone 6 and you save in DB: iPhone 6 , later the name gets changed to iPhone6 .

In this scenario if you search records with name iPhone6 , clearly, your above record will not show.

If you save numeric id, it will show irrespective of name change.

Coming back to your question:

I cannot write code here. But a pseudo code logic will help (hope so):

  1. Take a hidden field device_name .

  2. On change of drop down, with jQuery , assign value to hidden field.

  3. $("#assemblylinedd option:selected").text();

  4. Now, after submit, you will get device_name in hidden field.

  5. $devices = isset($_GET['device_name']) ? $_GET['device_name'] : '';

Save this to DB.

$link = mysqli_connect("localhost","root", "");
mysqli_select_db($link, "loginsystem");

$assemblyline = isset($_GET['assemblyline']) ? $_GET['assemblyline'] : '';
$devices = isset($_GET['devices']) ? $_GET['devices'] : '';


if(!empty(trim($assemblyline)))
{   
    $res = mysqli_query($link, "SELECT * FROM devices WHERE devices_id = '$assemblyline'");

    echo "<select id='devicesdd' onchange='change_devices()'>";

    while($row = mysqli_fetch_array($res))
    {

        echo "<option value='" . $row["id"] . "'>" . $row["name"] . "</option>";

    }

    echo "</select>";
}
  • I've added a proper empty check instead of your != "" , which didn't previously prevent a single space from being passed.
  • I've quoted your query value, I would definitely use prepared statements instead of passing values directly.
  • I've quoted your $row[id] .
  • I've concatenated your string correctly.

Note: It would be preferable to return a JSON array object with the IDs and the names instead of outputting HTML via the AJAX, it would make your code-base much cleaner and adaptable in the future.

Reading Material

empty

trim

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM