Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Našeptávač- jQuerry

Zdravím, chtěl jsem si udělat našeptávač, který bude komunikovat s db - tzn. dá na výběr možnosti, které obsahují zadanou část textu... snad to líp pochopíte takhle:

V DB mám kód, název, množství a jednotku - ta záleží na zboží, někde se počítá na kusy, někde kila...
Pak mám 4 inputy, název, množství....

Pokud je zvolena nějaká možnost vyplní se všechny inputy + input množství se sám vyplní a "zašedne" - nepůjde upravit(readonly), ale to není podstatné.

Teď k našeptávání, potřebuji aby se po napsání min. 3 znaků z Názvu nebo Kódu zobrazila nabídka možností z DB, odpovídajících prozatímnímu zadaní (tzn. nabídka se bud měnit pokud přidám další znak a bude přímo komunikovat s DB).

Po vybrání se vyplní všechny 4 inputy.
Text z DB jsem dostal jako řetězec, rozdelil jsem si ho znakem "=" na části, a každou jsem vyplnil do příslušného inputu.

Pak nastal první problém, inputy se sice vyplnili, ale až po tom, co se na ně kliklo. Navíc když se kliklo na input, zmizel text z předchozího. - Kdyby měl někdo s tímto zkušenost, budu moc rád za pomoc - google moc neporadil, buď to nefunguje, nebo je to nad moje možnosti :)

Děkuji - všechny kódy které můžete potřebovat vč. funkcí jsou níže.

<h2>Vložení položky dokladu:</h2>
<table>
<tr>
  <td>kód</td>
  <td>název</td>
  <td>množství</td>
  <td>jednotka</td>
  <td>&nbsp;</td>
</tr>

<tr>
  <td><input type="text" name="kod" id="nasept_kod" value="" size=8></td>
  <td><input type="text" name="nazev" id="nasept_nazev" value="" size=32></td>
  <td><input type="text" name="mnoz" id="mnoz" value="" size=5></td>
  <td><input type="text" name="merjed" id="merjed" value="" size=4 readonly></td>
  <td><input type="submit" name="vlozit" id="buttonvlozit" value="Vložit"></td>
</tr>
</table>

JQuerry cast
JQuerry 1.7.1.min.js
JQuerry-ui 1.8.18.custom.min.js

<script type="text/javascript">
<!--


$(document).ready(function(){
  $("#nasept_nazev").autocomplete({
    source: "getdatanazev.php",
    minLength: 3,
    delay: 0
  });
    
  
  $("#nasept_kod").autocomplete({
    source: "getdatakod.php",
    minLength: 3,
    delay: 0
  });


  $("#nasept_kod").bind("blur", function(){
    var text = $("#nasept_kod").val();
    var pole = text.split('=');
    $("#nasept_kod").val(pole[0]);
    $("#nasept_nazev").val(pole[1]);
    $("#merjed").val(pole[2]);
  });

  
  $("#nasept_nazev").bind("blur", function(){
    var text = $("#nasept_nazev").val();
    var pole = text.split('=');
    $("#nasept_kod").val(pole[0]);
    $("#nasept_nazev").val(pole[1]);
    $("#merjed").val(pole[2]);
  });



  $(function() {
    $("#nasept_kod3").autocomplete({
      source: "getdatakod.php",
      minLength: 3,
      select: function( event, ui ) {
        var text = "text1=text2=text3";
        var text = ui.item;
        var pole = text.split('=');
        alert(pole[0]);
        $("#nasept_kod").val(pole[0]);
        $("#nasept_nazev").val(pole[1]);
        $("#merjed").val(pole[2]);
    	},
      delay: 0
    });
	});

});
-->
</script>

getdatakod
JSON -JSON pro PHP4 - abych dostal řetězec z DB

<?php

include "./databaze.php";
require('JSON.php');  
$json = new Services_JSON();

//$term = trim(strip_tags($_GET['term']));
$term = trim($_GET['term']);

////$qstring = 'SELECT kod FROM zbozi WHERE kod LIKE "%'.$term.'%" LIMIT 60';
$qstring = 'SELECT kod, nazevCZ, merjed FROM zbozi WHERE kod LIKE "%'.$term.'%" LIMIT 60';

$result = mysql_query($qstring);

////while ($row = mysql_fetch_array($result)) $row_set[] = $row[0];
while ($row = mysql_fetch_array($result)) $row_set[] = $row[0].'='.$row[1].'='.$row[2]; // kod=nazev=merjed

$output = $json->encode($row_set);
echo $output;
?>

getdatanazev

<?php

include "./databaze.php";
require('JSON.php');  
$json = new Services_JSON(); 

//$term = trim(strip_tags($_GET['term']));
$term = trim($_GET['term']);

$qstring = 'SELECT kod, nazevCZ, merjed FROM zbozi WHERE nazevCZ LIKE "%'.$term.'%" LIMIT 60';
//$qstring = 'SELECT nazevCZ FROM zbozi WHERE nazevCZ LIKE "%'.$term.'%" LIMIT 60';

$result = mysql_query($qstring);//query the database for entries containing the term

while ($row = mysql_fetch_array($result)) $row_set[] = $row[0].'='.$row[1].'='.$row[2]; // kod=nazev=merjed
//while ($row = mysql_fetch_array($result)) $row_set[] = $row[0];

$output = $json->encode($row_set);
echo $output;
?>

Upravené odkazy do správneho tvaru. (los)

Předmět Autor Datum
Nikdo?... Nemáte alespoň nějakou stránku, nejlépe v CZ na které je to krok po kroku rozebráno?...
Swix 22.04.2012 16:00
Swix
Zavesil si sa na udalosť blur, t.j. po opustení vstupného poľa sa zavolá tvoja funkcia, ktorá na zák…
los 22.04.2012 19:00
los
Děkuji, jsi úžasný :) :D. SQLi plně zabraňuje poskytovatel hostingu (měl by)...
Swix 22.04.2012 22:01
Swix
Dost pochybuju, že by tomu dokázal zabránit.
Wikan 22.04.2012 22:06
Wikan
Ako si prišiel na to, že poskytovateľ hostingu by mal zabraňovať SQL injection? Nemám to síce otesto… poslední
los 22.04.2012 22:36
los

Zavesil si sa na udalosť blur, t.j. po opustení vstupného poľa sa zavolá tvoja funkcia, ktorá na základe hodnoty aktuálneho poľa vyplní ostatné polia. Po zvolení hodnoty z ponúknutých možností a opustení poľa je tou aktuálnou hodnotou ten reťazec so znakmi =, takže sa to ešte zachová ok. Po opustení druhého poľa sa už v tom prvom nenachádza hodnota so znakom =, takže sa to už nezachová správne.

Takže najjednoduchšie riešenie je prepísať výskyty blur na autocompleteselect (resp. to dať rovno do konfigurácie) a bude sa to chovať lepšie. Zostane tam ešte jeden problém - v aktuálnom poli ti zostane zvolená hodnota, pretože tá sa nastaví až po autocompleteselect. Takže ešte doplníš argumenty obslužnej funkcie "e" a "ui". V tele funkcie potom nastavíš ui.item.value na pole[0], resp. pole[1].

Máš tam bezpečnostný problém - SQL injection. Pozri si použitie funkcie mysql_real_escape_string (plus by si mal ošetrovať znaky % a _).

Ako si prišiel na to, že poskytovateľ hostingu by mal zabraňovať SQL injection? Nemám to síce otestované, ale tak si skús, ako napr. zabráni úniku dát pri takomto vstupe:

xxx" union select table_name,null,null from information_schema.tables where table_type not like "%system

Zpět do poradny Odpovědět na původní otázku Nahoru