Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][JavaScript][PHP]szybkosc strony
Forum PHP.pl > Forum > Przedszkole
viamarimar
Kod poniżej to kopia ze strony:
http://www.codexworld.com/autocomplete-tex...uery-php-mysql/
Tu demeo:
http://demos.codexworld.com/autocomplete-t...uery-php-mysql/

Nie to nie żadna reklama.
Mam pytanie. Chce zrobić coś takie że w bazie danych mam np 10000 składników. Teraz dodaje przepis do przepisu nie dodaje skladnikow standardowo w textarea tylko z wyboru z tych 10000. Chciałbym by było autopodpowiadanie jak powyżej. Moje pytanie brzmi czy przy tym układzie wszystkie te 10000 skladnikow musi byc umieszczone w kodzie, bo sql bedzie je zawsze pobieral do tablicy na ktorej operuje przykladowy skrypt? Czy jest jakieś inne rozwiazanie, tak by nie bylo tego w kodzie? Czy takie coś zwalnia stronę?( moim zdaniem, i z tego co wiem każda linia html zwalnia w jakim stropniu skrypt)

A teraz zalozmy ze takie pole wyszukujace jest jedno dla kazdego skladnika. Dynamicznie mozna dodac ich z 50(limit skladnikow w przepisie). Co znaczy, że takich tablic bylo by az 50? TO dramatycznie zwalnia strone, co z tym fantem zrobic?


  1. <?php
  2. //database configuration
  3. $dbHost = 'localhost';
  4. $dbUsername = 'root';
  5. $dbPassword = '';
  6. $dbName = 'codexworld';
  7.  
  8. //connect with the database
  9. $db = new mysqli($dbHost,$dbUsername,$dbPassword,$dbName);
  10.  
  11. //get search term
  12. $searchTerm = $_GET['term'];
  13.  
  14. //get matched data from skills table
  15. $query = $db->query("SELECT * FROM skills WHERE skill LIKE '%".$searchTerm."%' ORDER BY skill ASC");
  16. while ($row = $query->fetch_assoc()) {
  17. $data[] = $row['skill'];
  18. }
  19.  
  20. //return json data
  21. echo json_encode($data);
  22. ?>
Puszy
Udźwignij to poprzez Ajaxa. Utwórz skrypt który będzie szukał produktów na podstawie szukanego ciągu, załóż że składnik musi składać się z minimum 3 znaków, po wpisaniu 3 znaków przez użytkownika uzyj Ajaxa aby odwołać się do serwera, przekaż suzkany ciąg, wyszukaj go w bazie i dynamicznie wyświetl podpowiadanie z wyborem. Polecam do tego Select2, link do przykładu który opisałem wyżej: https://select2.github.io/examples.html#data-ajax
viking
Zamiast query użyj http://php.net/manual/en/mysqli.prepare.php Teraz masz jedną wielką dziurę podatną na SQL Injection.
viamarimar
Tylko ja musze mieć jakiś działający przykład by ruszyć dalej. W sensie u siebie.

Pytanie, zrobilem cos takiego na localhoscie:

plik 1 (index.html)
  1. <html lang="en">
  2. <head>
  3. <title>Bootstrap Typeahead with Ajax Example</title>
  4. <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  5. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.1/bootstrap3-typeahead.min.js"></script>
  7. </head>
  8. <body>
  9.  
  10. <div class="row">
  11. <div class="col-md-12 text-center">
  12. <br/>
  13. <h1>Search Dynamic Autocomplete using Bootstrap Typeahead JS</h1>
  14. <input class="typeahead form-control" style="margin:0px auto;width:300px;" type="text">
  15. </div>
  16. </div>
  17.  
  18. <script type="text/javascript">
  19.  
  20. $('input.typeahead').typeahead({
  21. source: function (query, process) {
  22. return $.get('/ajaxpro.php', { query: query }, function (data) {
  23. console.log(data);
  24. data = $.parseJSON(data);
  25. return process(data);
  26. });
  27. }
  28. });
  29.  
  30. </script>
  31. </body>
  32. </html>


plik2 (ajaxpro.php)
  1. <?php
  2.  
  3. $db = "localhost";
  4. $db_user = "root";
  5. $db_pass = "";
  6. $db_name = "dump";
  7. $link = mysqli_connect($db, $db_user, $db_pass);
  8. if (!$link) {
  9. die("Not connected : " . mysqli_error());
  10. }
  11.  
  12. $db_select = mysqli_select_db($link,$db_name);
  13. if (!$db_select) {
  14. die ("Can't use".$db_name." : " . mysqli_error());
  15. }
  16.  
  17. if(isset($_GET['query'])) {
  18.  
  19. $sql = "SELECT city FROM zips WHERE city LIKE '%".$_GET['query']."%'
  20. LIMIT 10";
  21. $result= mysqli_query($link,$sql) or die(mysqli_error());
  22.  
  23.  
  24. $json = [];
  25. while($row = mysqli_fetch_assoc($result)){
  26. $json[] = $row['city'];
  27. }
  28.  
  29. echo json_encode($json);
  30. }
  31.  
  32.  


Coś działa.. coś nie działa heh..
Jest pole szukajki, w szukajke jak wpisuje to za każdym razem są zmiany w consoli pojawiaja sie przekierowania przykadowo:
Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/ajaxpro.php?query=al Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/ajaxpro.php?query=alf Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/ajaxpro.php?query=alfs Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/ajaxpro.php?query=alfss Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/ajaxpro.php?query=alfsss Failed to load resource: the server responded with a status of 404 (Not Found)
Problemem jest to że adres taki nie istnieje, tylko dlaczego skoro:

tu tak jakby ustawiam by tam kierowalo:
  1. return $.get('/ajaxpro.php', { query: query }, function (data) {

a tu sprawdzam jesli istnieje taki get to pobieraj itd..
  1. if(isset($_GET['query'])) {



Na początek chodzi o te przekierowania tylko. Jak się to ustawia by "ajax?" przesylal dane
viking
Masz wyraźnie 404 na ajaxpro.php. Jesli to jest gdzieś w folderze to jest różnica między /plik a plik (bez /)
viamarimar
Serio chodziło o kreske, ale mógłbyś więcej w tym temacie.

I jak by to zapisać jak bym mial np link typu:

index.php&cos1=a&cos2=b&cos3=c

na podstawie powzyszego kodu.
viking
Poczytaj o ścieżkach absolutnych i relatywnych. Znaczy co zapisać?
viamarimar
Chodzi o to że robiłem to na localhoscie - gdy zadzialalo człowiek mysli o super wreszcie pojdzie z góki. Ta bójda..

Te same pliki wrzuciłem na server.

Sciezka:
/home/x/y/login/public_html/test/a/inc/inc_index/form

Ustawilem tak:
  1. return $.get('../a/inc/inc_index/ajaxpro.php', { query: query }, function (data) {

czyli tak jakby wszystko w tyl.

Co na konsoli sie pokrywa z rzeczywistoscia:

  1. GET <a href="http://www.bllblb.pl/~login/test/a/inc/inc_index/ajaxpro.php?query=a" target="_blank">http://www.bllblb.pl/~login/test/a/inc/inc...pro.php?query=a</a> 404 (Not Found)


Pomóżcie mi to rozwiązać i już nic nie truje więcej smile.gif
To jednorazowo mi potrzebne.
viking
../ oznacza katalog wyżej w stosunku do aktualnego. Skoro masz całą ścieżkę i widzisz do jakiego pliku jest 404, to dlaczego po prostu trochę nie pokombinujesz? Wielkość liter na linuksie też ma znaczenie.
viamarimar
Ok, jest wporządku, tylko takie pytanie czemu gubią sie gdzieś pod drodze polskie znaki?

tzn w bazie jest np słowo nabiaŁ
po skorzystaniu z powyższego skryptu jest już nabia?

-w head ustaione utf
- w pliku jest kodowanie utf(bez bom)
- w bazie tez utf

do tej pory nie było z tym problemu
czy json trzeba jakos specjalnie konwertowac?
viking
Nie widzę żebyś gdziekolwiek ustawial w tym pliku nagłówek nawet z informacją ze to json. Zbędna jest też cała pętla.
viamarimar
Tylko jeśli wywale pętle to jest tak:

  1. [null]
  2. bootstrap3-typeahead.min.js:1 Uncaught TypeError: Cannot read property 'name' of null
  3. at b.displayText (bootstrap3-typeahead.min.js:1)
  4. at b.matcher (bootstrap3-typeahead.min.js:1)
  5. at bootstrap3-typeahead.min.js:1
  6. at Function.grep (jquery.js:753)
  7. at b.process (bootstrap3-typeahead.min.js:1)
  8. at proxy (jquery.js:818)
  9. at Object.success (index.php?s=test&a=add:595)
  10. at fire (jquery.js:1037)
  11. at Object.fireWith [as resolveWith] (jquery.js:1148)
  12. at done (jquery.js:8074)
viking
Zamiast assoc http://php.net/manual/en/mysqli-result.fetch-all.php i od razu do json. I popraw query na prepare.
viamarimar
To tylko przykład ale

1.Czy zamiast prepare nie mozna uzyc mysqli_real_escape_string?
2. pierwszy raz slysze o czym takim jak feach_all tak naprawde
czy chodzi o cos takiego:
  1. $resultArray = $result->fetch_all(MYSQLI_ASSOC);
  2. echo json_encode($resultArray);

Bo w ten desen to nie dziala.
viking
Stosujesz styl proceduralny zatem
  1. echo json_encode(mysqli_fetch_all($result, MYSQLI_ASSOC));


1. Nie, nie można.

Brakuje ci jeszcze http://php.net/manual/en/mysqli.set-charset.php

https://prophp.pl/advice/show/14/jak_czytac...mentacje_php%3F
viamarimar

Mam inputa korzystam z typeahed.js
  1. <input name="first0" type="text" class="typeahead0 form-control" >

jsonem przesylam tablice do
np:

wcześniej były same nazwy, ale przeciez pola konkretnego uzywamy po id
tablica jsona:
[{"name":"Banan","id":"8"},{"name":"banan","id":"365"},{"name":"banan suszony","id":"366"},{"name":"Banany","id":"1302"},{"name":"Baton banan-marchew-marakuja","id":"910"},{"name":"Kaszka o smaku bananowym","id":"1305"},{"name":"Mąka bananowa ","id":"831"},{"name":"Suszone Banany","id":"1303"}]

wiec pytanie czy mogę wyciagnac jakos ID dla danego name i przypisac w value inputa?
viking
Inputy możesz tworzyć za pomocą each() + val(). Chociaż podejrzewam że tobie bardziej coś w stylu http://textextjs.com/manual/examples/autoc...-with-tags.html jest potrzebne.
viamarimar
Wiem jak tworzyc inputy i calosciowo dziala.

problem jest w tym,że gdy mialem select to bylo cos na zasadzie:

  1. <select name="first0" id="select3-recipes" required>
  2.  
  3. while($row = mysqli_fetch_assoc($result)) {
  4. echo '<option value="'.$row['product_id'].'">'.$row['product_name'].'</option>';
  5. }
  6. ...


Teraz mam cos takiego:

  1. $sql = "
  2. SELECT ".$prefix."product.*
  3. FROM ".$prefix."product
  4. WHERE ".$prefix."product.product_name LIKE '%".$_GET['query']."%'
  5. AND ".$prefix."product.product_active = '1'
  6. ORDER BY product_name ASC LIMIT 10 " ;


  1. $json[] = array (
  2. 'name' => $row['product_name'],
  3. 'id' => $row['product_id'],
  4. );



  1. <input name="first0" type="text" class="typeahead0 form-control" >


ale w tym inpucie nie mam parametru value i chce osiagnac efekt :
wybierajc/wpisujac np banany w input zeby w value pokazywal sie jego id w tym przypadku np 8


viking
Na stronie projektu https://github.com/bassjobsen/Bootstrap-3-Typeahead masz przykład na dole z getActive.
viamarimar
Nie bardzo wiem jak by to miało pomóc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.