Avatar billede larsgrau Forsker
27. maj 2020 - 20:10 Der er 12 kommentarer og
2 løsninger

bruge id stedet for navn

Hej

fra MS access kan jeg huske at når man laver en liste/combobox, så kunne man lave det sådan her

ID | Name | Efternavn
1 | Lars | Hansen
2 | Martin | Larsen

osv. og når man så valgte en af dem kunne man få den til at vise værdien af Name og ikke ID og Efternavn, men den kunne huske ID hvis man skulle bruge den til at finde en værdi i en forespørgelse,

Men hvordan får man html/php what ever tilat gøre det samme ?

jeg har ikke nogen ide.

Håber der er nogen som kan hjælpe
Avatar billede olsensweb.dk Ekspert
27. maj 2020 - 21:16 #1
du skal lave noget javascript (js) / jquery (jq).
da du anvender jq på din side i forvejen vil jeg anbefale den løsning.
ref https://stackoverflow.com/questions/29882361/show-datalist-labels-but-submit-the-actual-value
jq http://jsfiddle.net/7k3sovht/9/
js http://jsfiddle.net/7k3sovht/7/

ellers skal du bare lave en selectbox
https://www.w3schools.com/tags/tag_select.asp
Avatar billede larsgrau Forsker
28. maj 2020 - 20:14 #2
Hej

Jeg kan ikke rigtigt få det til at virke, sådan som jq linket siger, kan du hjælpe mig ?

<form id="myForm">
    <input list="answers" id="answer">
    <datalist id="answers">
        <option data-value="42">The answer</option>
        <option data-value="1337">Elite</option>
        <option data-value="69">Dirty</option>
        <option data-value="3">Pi</option>
    </datalist>
    <input type="hidden" name="answer" id="answer-hidden">
    <input type="submit">
</form>

<p>Submitted value (for debugging):</p>
<pre id="result"></pre>


<script>
$('input
    ').on('input', function(e) {
        var $input = $(e.target),
            $options = $('#' + $input.attr('list') + ' option'),
            $hiddenInput = $('#' + $input.attr('id') + '-hidden'),
            label = $input.val();

        $hiddenInput.val(label);

        for(var i = 0; i < $options.length; i++) {
            var $option = $options.eq(i);

            if($option.text() === label) {
                $hiddenInput.val( $option.attr('data-value') );
                break;
            }
        }
    });

    // For debugging purposes
    $("#myForm").on('submit', function(e) {
        $('#result').html( $('#answer-hidden').val() );
        e.preventDefault();
    });
    </script>
Avatar billede larsgrau Forsker
28. maj 2020 - 20:23 #3
har lige ind sat dette i toppen

jquery er downloaded og ligger i samme mappe

<html>
<script src="http://localhost/test6/jquery-2.1.3.js"></script>
Avatar billede olsensweb.dk Ekspert
28. maj 2020 - 20:39 #4
har lige prøvet at kopierer fra http://jsfiddle.net/7k3sovht/9/ og det virker
demo https://olsensweb.dk/experten/lars.html
Avatar billede larsgrau Forsker
28. maj 2020 - 23:04 #5
Hej igen

nu har jeg også fået den til at virke takker, men jeg har et problem hvis der er to navne som er ens men de har hver sit id. jeg bruger denne kode til option

    <datalist id="answers">
        <?php
        $res=mysqli_query($db,"select * from shiplist");
        while($row=mysqli_fetch_assoc($res))
        {
        ?>
        <option data-value="<?php echo $row["id"]; ?>"><?php echo $row["shipname"];  ?></option>
        <?php
        }
        ?>
    </datalist>

hvis der er 2 navne som er ens men de har hver sit id, så tager den bare det først id den møder.

ved ikke rigtigt hvor det går galt henne
Avatar billede ejvindh Ekspert
29. maj 2020 - 16:30 #6
Generelt er det vel noget rod at have to identiske entries i en selectable, da brugeren jo så ikke kan vide, hvilken der er den "rigtige". Derfor vil jeg råde til, at du i din while-loop tester for dubletter, inden du laver en <option> ud af den fundne række. Dét vil ganske vist give dig en udfordring med, at der så er nogle navne, du ikke kan få lov at vælge i dropdown'en.

Hvis det sidste er et problem, er den bedste løsning måske at gøre id'en til en del af navnet. Noget i stil med (ikke testet):
<option data-value="<?php echo $row["id"]; ?>"><?php echo $row["shipname"].' ('.$row["id"].')';  ?></option>
Avatar billede olsensweb.dk Ekspert
29. maj 2020 - 17:22 #7
#5 >ved ikke rigtigt hvor det går galt henne
det er pga den kun ser navnet i input feltet, og stopper med at se vidre pga break i
if(option.innerText === label) {
    hiddenInput.value = option.getAttribute('data-value');
    break;
}


>er den bedste løsning måske at gøre id'en til en del af navnet.
nok også den mest simple der virker :)

nu når der ikke er en selected på datalist
https://stackoverflow.com/questions/4724713/is-there-a-selectedindex-for-an-html5-datalist



#6 forslag ført ud i livet
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title></title>
    </head>
<body>
<form id="myForm">
    <input list="answers" id="answer">
    <datalist id="answers">
        <option data-value="42">042 The answer</option>
        <option data-value="137">137 Elite</option>
        <option data-value="69">069 Dirty</option>
        <option data-value="87">087 Dirty</option>
        <option data-value="3">003 Pi</option>
        <option data-value="7">007 Pi</option>
    </datalist>
    <input type="hidden" name="answer" id="answer-hidden">
    <input type="submit">
</form>
<script>
document.querySelector('input
    ').addEventListener('input', function(e) {
        var input = e.target,
            list = input.getAttribute('list'),
            options = document.querySelectorAll('#' + list + ' option'),
            hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
            label = input.value;
        hiddenInput.value = label;
        for(var i = 0; i < options.length; i++) {
            var option = options[i];
            if(option.innerText === label) {
                hiddenInput.value = option.getAttribute('data-value');
                break;
            }
        }
    });
    </script>
    </body>
    </html>

om det ser pænt ud for brugeren tja, men hvordan skal han se hvilke han skal vælge, hvis navne ikke er entydige

foranstillede 0 for at få det til at stå pænt under hinnanden
du kan lave det med dette
str_pad($num, 3, "0", STR_PAD_LEFT);   
https://www.php.net/str_pad
Avatar billede olsensweb.dk Ekspert
29. maj 2020 - 17:48 #8
du kunne også overveje at sende dine id'er over komma seperaret

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title></title>
    </head>
<body>
<form id="myForm">
    <input list="answers" id="answer">
    <datalist id="answers">
        <option data-value="42">The answer</option>
        <option data-value="1337">Elite</option>
        <option data-value="69">Dirty</option>
        <option data-value="87">Dirty</option>
        <option data-value="3">Pi</option>
        <option data-value="7">Pi</option>
    </datalist>
    <input type="hidden" name="answer" id="answer-hidden">
    <input type="submit">
</form>

<script>
document.querySelector('input
    ').addEventListener('input', function(e) {
        var input = e.target,
            list = input.getAttribute('list'),
            options = document.querySelectorAll('#' + list + ' option'),
            hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
            label = input.value;

        hiddenInput.value = label;
       
        var id_er=[];
        for(var i = 0; i < options.length; i++) {
            var option = options[i];

            if(option.innerText === label) {
                id_er.push(option.getAttribute('data-value'));           
            }
        }   
        hiddenInput.value = id_er.toString();
       

    });
    </script>
    </body>
    </html>

og lave en explode serverside, for at adskille id'erne
Avatar billede larsgrau Forsker
29. maj 2020 - 21:21 #9
Hej igen

jeg er gået med ideen om at sætte flere ting ind i listen så de alle er forskeldige, men man skal huske kun at lave 1 mellem rum mellem ting i listen, jeg syntes | ville være fedt, men det kan den ikke lide.

<!doctype html>
<html lang="en">
   
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="http://localhost/test6/jquery-2.1.3.js" crossorigin="anonymous"></script>
    </head>

<body>

<form id="myForm">
    <input list="answers" id="answer" onchange="shipnamechange()">
    <datalist id="answers">
        <?php
        $res=mysqli_query($db,"select * from shiplist");
        while($row=mysqli_fetch_assoc($res))
        {
        ?>
        <option data-value="<?php echo $row["id"]; ?>"><?php echo $row["samlet"];  ?></option>
        <?php
        }
        ?>
    </datalist>
    <input type="hidden" name="answer" id="answer-hidden">
</form>
       
       
       

<p>Submitted value (for debugging):</p>
<pre id="result"></pre>

<input type="text" id="name" placeholder="name">
<input type="text" id="class" placeholder="class">
<input type="text" id="pnt" placeholder="pnt">
<script>
function shipnamechange(){
    var ajax = new XMLHttpRequest();
    var method = "GET";
    var x = document.getElementById("answer-hidden").value;
    var url = "shipnamechange.php?shipname=" + x;
    var asynchronous = true;
    ajax.open(method, url, asynchronous);
    ajax.send();
    ajax.onreadystatechange = function()
    {
            if (this.readyState == 4 && this.status == 200)
            {
                var data = JSON.parse(this.responseText);
                console.log(data)
                var html = "";
                for (var a = 0; a < data.length; a++)
                {
                    var skibsnavn = data[a].shipname;
                    var Classnavn = data[a].Classname;
                    var shiprole = data[a].shiprole;
                    var shippnt = data[a].shippnt;
                    var shipcountries = data[a].shipcountries;
                }
                document.getElementById("name").value = skibsnavn;
                document.getElementById("class").value = Classnavn;
                document.getElementById("pnt").value = shippnt;
                document.getElementById("answer").value = skibsnavn;
               
            }
    }
}
</script>

<script>

$('input
    ').on('input', function(e) {
      var $input = $(e.target),
        $options = $('#' + $input.attr('list') + ' option'),
        $hiddenInput = $('#' + $input.attr('id') + '-hidden'),
        label = $input.val();

      $hiddenInput.val(label);

      for (var i = 0; i < $options.length; i++) {
        var $option = $options.eq(i);

        if ($option.text() === label) {
          $hiddenInput.val($option.attr('data-value'));
          break;
        }
      }
    });


    // For debugging purposes
    $("#myForm").on('submit', function(e) {
      $('#result').html($('#answer-hidden').val());
      e.preventDefault();
    });

    </script>
    </body>
    </html>
Avatar billede olsensweb.dk Ekspert
29. maj 2020 - 22:45 #10
>jeg syntes | ville være fedt, men det kan den ikke lide.
jeg har ikke problemer med |
jeg har lavet lidt små rettelser, js og i shipnamechange.php
det hele er pakket ned i denne fil
http://olsensweb.dk/experten/1033535_final.zip
Avatar billede olsensweb.dk Ekspert
30. maj 2020 - 07:23 #11
Avatar billede larsgrau Forsker
02. juni 2020 - 10:47 #12
Det er super fedt, det virker bare som det skal.

jeg har lige et lille spørgsmål

i denne line kan man sætte et felt mere ind, jeg har prøvet med følgende

<option data-value="<?php echo $row['id']; ?>"><?php echo str_pad($row['id'], 3, '0', STR_PAD_LEFT).'|'.$row['shipname'], (STR_PAD_LEFT).'|'.$row['Country']?>
</option>

men så får jeg et 0 efter shipname, se lidt træls ud*S*
Avatar billede ejvindh Ekspert
02. juni 2020 - 11:06 #13
<option data-value="<?php echo $row['id']; ?>"><?php echo str_pad($row['id'], 3, '0', STR_PAD_LEFT).'|'.$row['shipname'].'|'.$row['Country']?>
</option>
Avatar billede olsensweb.dk Ekspert
02. juni 2020 - 13:32 #14
man kunne også lege med sprintf
https://www.php.net/manual/en/function.sprintf.php

<option data-value="<?php echo $row['id']; ?>"><?php echo sprintf("%03d|%'.-20s|%s",$row['id'],$row['shipname'],$row['Country'] )?></option>

og se om man ikke kan style med noget monospace, så |står under hinanden efter shipname
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester