Saját search form

Sir_Csavar képe

Sziasztok!

Csak a szokásos segítségért vagyok itt. :) Oldalra kell egy halál egyszerű 1 soros kereső menü ami a már kitárgyalt SQL lekérdezést letudja futtatni karakter behelyettesítéssel.
Nézegettem a searc formok de vagy túl van nekem bonyolítva vagy nem is értem. Próbáltam hozzá valami segédlet félét keresni (ugy a gugli a barátom) de nem nagyon volt találat.
Naív módon gondoltam, hogy majd egy egyszerű php kereső milyen jó lesz nekem és megjelenít mindent. Befürödtem vele :)

Esetleg tudtok ehhez valamiféle Drupal search form for tök dummies -t?

Üdv!

Drupal verzió: 
lili_ képe

nekem volt egy saját kis keresőm, ami személy nevek alapján keres saját táblában

van egy textfield mező ahol bekérem a nevet, keresés, és mégse gomb

$items["szures"]=array(
    "title" => t("Szemelyek szurese"),
    "page callback"=>"szervegyseg_probakereses",
    "access arguments" => array("szervegyseg admin"),
    "type" => MENU_CALLBACK,
  );
 
 
 
function szervegyseg_probakereses_form()
{
$form["search"] = array(
		"#type" => "fieldset",
		"#title" => t("Search"),
		"#collapsible" => TRUE,
		"#collapsed" => $_SESSION["sajat_kereso"]["in_search"] ? FALSE : TRUE
	);
	$form["search"]["mezo"] = array(
		"#type" => "textfield",
		"#title" => t("Adja meg a személy nevét"),
		"#default_value" => $_SESSION["sajat_kereso"]["mezo"],
		"#size" => 30
	);
 
$form["search"]["submit"] = array(
		"#type" => "submit",
		"#value" => t("Search"),
 
);
 
	$form["search"]["cancel"] = array(
		"#type" => "submit",
		"#value" => t("Cancel"),
	);
 
 
	//hova menjen vissza az oldal ha lement a keresés, mi az oldal URL-je
	$form_state["#redirect"] = "szures";
	return $form;
}
 
function szervegyseg_probakereses_form_submit($form, &$form_state)
{
 
$in_search = false;
 
	if ($form_state["values"]["op"] == t("Search"))
	{
		if (isset($form_state["values"]["mezo"]))
		{
			$_SESSION["sajat_kereso"]["mezo"] = $form_state["values"]["mezo"];
			$in_search = true;
		}
 
	}
	else // ha a mégse gombot nyomtam meg akkor törlődik az előző keresés
	{
		unset($_SESSION["sajat_kereso"]["mezo"]);
 
		$in_search = false;
	}
	$_SESSION["sajat_kereso"]["in_search"] = $in_search;
 
}
 
//próbakeresés
function szervegyseg_probakereses(){
$html=""; //ebbe fogom visszaadni az eredményt
$rows=array();
/*a találatok táblázatban fognak kiíródni*/
$header = array('Személy neve','Személy e-mail címe');
 
	if ($_SESSION["sajat_kereso"]["in_search"] && $_SESSION["sajat_kereso"]["mezo"] != "")
 			{
 
				$nev= $_SESSION["sajat_kereso"]["mezo"];
				//ez lesz a keresett név mező
				$szemely_nev= $keys = preg_replace('!\*+!', '%', $nev);
 
 
 
		$mu = sprintf("SELECT * FROM szemely WHERE LOWER(name) LIKE LOWER('%%%s%%')", $szemely_nev);
 
 
 
 
//meg kell jeleníteni a keresés formját
$rs = db_query($mu);
 
//ha van találat akkor is meg kell jeleníteni a keresés formját
//meg kell jeleníteni a keresés formját
   	 $html .= drupal_get_form("szervegyseg_probakereses_form");
	   $html.="<br/>";
     while($data = db_fetch_array($rs)){
 
      //az adott személy nevét és e-mail címét fogom megjeleníteni
      //az adatbázisban mi a megfelelő tábla megfelelő oszlop neve
              //$html.=$data["name"];
              //$html.="---";
              //$html.=$data["email"];
             // $html.="<br/>";
              $rows[] = array(
                   array("data"=>$data["name"]),
                   array("data"=>$data["email"]),
                 );
 
      }
     $tik = theme('table',$header,$rows);
 
      $html.=$tik;
 
}
 
//alapból is meg kell jeleníteni
	else{	$html .= drupal_get_form("szervegyseg_probakereses_form");}
 
	return $html;
 
}
0
0

mini

Lavjaman képe

Drupal 6-ban nincs submit hook -> http://drupal.org/node/114774#hook_submit

a sessionos részen teljesen belekeveredtem, hogy végül is mit csinálsz :)

tudom javasolni még a jó paraméterezéseket: api.drupal.org

de amúgy *gondolom* jó

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

lili_ képe

nekem működik a session rész azért van, ha lenyomom h mégse akkor a textfield-be beírt rész ill. a keresés eredménye törlődik...

sajnálom h nem segítettem....

0
0

mini

Lavjaman képe

ezt a mégse-dolgot önmagában nem értem...
Mármint: ha mégse akar keresni, akkor nem fog rányomni a "Keress" gombra nem? :)

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

lili_ képe

a hook_submit-ban igazad van, a session részbe most ne menjünk bele :)

ez kezdeti szárnypróbálgatás volt, és az illető egyszerű példát kért, én azt hittem egyszerű :(

0
0

mini

Sir_Csavar képe

ne szomorkodj, eljön a nap amikor én is egyszerűnek fogom mondani, csak előtte jó lenne tudni, hogy mi mit csinál és mi miért és mit csinál :D
fel van adva a feladat. és még egyszer köszönöm!

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

Kérlek félre ne értsd, nem és NEM akartam leszólni a kódodat. Csak nem értettem ^^

Másrészt:

Sörcsavar: csinálsz egy formot, a form submitjába beleillesztesz egy callbacket, ott feldolgozod az adatokat, majd az eredménnyel visszatérsz

form api jó olvasmány

a gugli a barátod

a wiki meg a barátnőd

:D

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

a wikikkel sosem jöttem ki jól, de gugli még nem okozott csalódást. :)

akkor most form api meg callback és meglátjuk mi lesz. amúgy a baj sokszor nem azzal van, hogy az ember nem tud keresni, hanem, hogy nem tudja, hogy mit kell keresnie ;)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Sir_Csavar képe

amúgy nagyon kedves tőled, hogy megosztottad, de nem tudom... valahogy ez nekem nagyon úgy tűnik, hogy túl van bonyolítva drupalon. vagy ez csak azért van mert ránéztem és elborzadtam?:)

bár most, hogy valaki anonymként nekem ajándékozta "bibliát" kezd kirajzolódni, hogy mi a francot művel ez a cucc

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

csg képe

...de jobban tennéd, ha követnéd a drupal kódolási szabványait:
http://drupal.org/coding-standards

Az egyforma kódolási stílus nagyban megkönnyíti a programozók összedolgozását, ezért van kódolási szabványa a drupalnak is. Lehet, hogy egyelőre önállóan dolgozol, de bármikor eljöhet az idő, mikor ez változik, érdemes emiatt mielőbb ráállni. Biztos mi is jobban értenénk a kódjaid, ha rendesen lennének formázva (és a kezdőknek sem mutatsz így jó példát...).

Segítség lehet a Coder modul, ami leellenőrzi a kódod formázásának helyességét:
http://drupal.org/project/coder

Köszi a figyelmet!

0
0

--
Csonka Gergely
http://cheppers.com

lili_ képe

ha az én kódomra érted az útmutatást, akkor köszi!

0
0

mini

lili_ képe

amúgy hook_search nem jó, az könnyebb szerintem, mint ez, de ha külön kell a kereső mező akkor .....

0
0

mini

Sir_Csavar képe

a dolog úgy néz ki. van egy oldal amin rajta lesz ez a kereső mező, és keresés után ugyan ezen az oldalon a mező alatt megjelenik a találat ami nem sok, 1-1 sor.

de ha jól értem a form api dolgát, és a helyzetet. létre hozom a formot, és a submit gombnak adok egy 'page callback' => 'meghivando_funkciot' utasítást. és akkor elvileg ugyan azon az oldalon kapom meg az értéket is.

javítsatok ki kérlek, ha tévedek! :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

lili_ képe

igen ahogy leírta a srác is...

0
0

mini

Sir_Csavar képe

én vagyok a hülye, de ez miért nem tudom megnyitni?

http://www.cim/om_kereso --- oldal válasza: Az oldal nem található
vagy ennyire félre értelmeztem volna valamit?
"$items['om_kereso'] = array..." ez az útvonal, nem?

<?php
 
function om_search() {
  $items = array();
  $items['om_kereso'] = array
    'title' => t('OM kereső'),
    'page callback' => 'om_kereso_oldal',
    'description' => t('keresés'),
	'access arguments' => array('access content'),
    'type' => CALLBACK,
  );
  return $items;
}
 
function om_kereso_oldal() {
	return drupal_get_form('om_kereso_form');
}
 
function om_kereso_form($form_state) {
 
    $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('om keresés'),
  );
    $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
	/*'#page callback' => 'kereses',*/
  );
 
  return $form;
}
0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

/admin/build/modules
/admin/build/menu

Ezeket az oldalakat látogasd meg és menni fog :)

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

modulok közt engedélyezve van ha meg menüként hozzá akarom adni az om_kereso elérést akkor beszól: A 'om_kereso' útvonal vagy érvénytelen, vagy nincs megfelelő jogosultság az eléréséhez.

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

most vettem csak észre:

menu type: CALLBACK? :)

Tessék figyelmesen elolvasni, hogy menüt hogyan építgetünk

(a helyes egyébként: MENU_CALLBACK)

kapcsolódó oldal: http://api.drupal.org/api/function/hook_menu/6

ha javítottad, akkor a fenti két oldalt látogasd meg újra és működni fog

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

csak itt volt elírva, a feltöltött fájlban helyesen szerepel.

tehát akkor ahogy most kinéz és produkálja a hibát:

<?php
// $Id: $
 
function om_search() {
  $items = array();
  $items['om_kereso'] = array(
    'title' => t('OM kereső'),
    'page callback' => 'om_kereso_oldal',
    'description' => t('keresés'),
	'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
function om_kereso_oldal() {
	return drupal_get_form('om_kereso_form');
}
 
function om_kereso_form($form_state) {
 
    $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('om keresés'),
  );
    $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
	/*'#page callback' => 'kereses',*/
  );
 
  return $form;
}
?>
0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

function om_search() {
  $items = array();
  $items['om_kereso'] = array(
    'title' => t('OM kereső'),
    'page callback' => 'om_kereso_oldal',
    'description' => t('keresés'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
function om_kereso_oldal() {
    return drupal_get_form('om_kereso_form');
}
 
function om_kereso_form($form_state) {
    $form = array();
 
    $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('om keresés'),
  );
    $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
  );
 
  return $form;
}

És ez nem jelenik meg a navigációdnál? O.O Ha rebuildeled a menüdet akkor sem?

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

rebíld alatt azt érted, hogy sminkeknél újra elmentem a dolgot akkor meg volt. kess ürítést meg volt.

esetlegesen rosszul hivatkozom rá?

http://www.valami.hu/om_kereso

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

szóóval: látogass el az admin/build/modules oldalra, mert ez újraépíti a menüt *menurebuild*

utánna keresd a menüdet a navigációs blockban

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

kipróbáltam másik oldalon is, ugyan ez történt.

kérdésem a következő. mivel a menu path ot végülis magától generálja, az én gondolat menetem szerint a a callback menüt és ő generálja ki, a kapott adatból. ha tévedek akkor az a hiba. remélem

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

Én hülye...

Azér nem látod, mert ezt egy MENU_CALLBACK

Kell írnod a menübe egy menu_normal_item-et ...

hülye hülye hülye én ^^

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

******

hülyeséget kérdeztem :)

de figyi, tudom, hogy mindened tele van a hülyeségeimmel. így se megy :D
most elvileg ha nem is jelenik meg magától feltudnám venni menü elemnek és boldogan élne míg le nem törlöm. de nem :))))))))

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

Mivel mi mind mind nagyon akkurátus emberek vagyunk, ezért a legfaszább megoldást csináljuk ok?

A menu callbacket felejtsd el, arra *jelen esetben* akkor lenne szükséged, ha autocomplete keresőt szeretnél csinálni.

//attól függően, hogy milyen módon szeretnéd a keresődet:

Csinálsz egy menu hookot, benne egy menu normal itemmel *ez akkor jó, ha külön oldalra akarod a keresődet és csak azon az egy oldalon használod

VAGY

csinálsz egy hook_blockot és ott hívod meg a formodat *a submitján pedig feldolgozod*

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

1 adott oldalra lesz a kereső ez tuttkerály. de most megint mondtál valami újat, aminek utána kell lesnem. menu_hook. :))

ááááááááááááá csak én vagyok ilyen bonyolult/suta vagy ez egy átlag ember számára az elején télleg ilyen hárdkór?!

ha jól értem akkor a változás kb ennyi:

function hook_menu()

ehelyett

function om_search()

vagy ezzel most leírtam ugyan azt?... :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

ember... most kapcsolatam
...

ha menu-t szeretnél, akkor modulnev_menu() funkciót kell használnod :)
ami függvény neked kell:

ok_search_menu() {
// ide kerül az ok_search függvényed tartalma
}

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

lili_ képe

és hogy van a kód többi része, mikor a keresést feldolgozod, engem ez érdekelne majd a későbbiekben köszike

0
0

mini

Sir_Csavar képe

először jelenjen meg végre a form :)))) én most már télleg nem tudom hogy mit és hol hibázok, végig néztem az api leírásokat, néztem példákat, tutorialok, ugyan ezt írták mindenhol én csak átírtam a saját menümre a neveket és semmi. nekik meg simán :) berosok. pedig biztos én mulasztok! :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

tudsz várni estig, akkor elkészítem neked és ide felrakom oks?

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

gondolod átküldöm neked ami eddig meg van. van még alja is :D:D:D

amúgy persze jó estére. majd valahogy meghálálom neked. meghívlak alkalom adtán egy sörre :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

küldjed :)

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

ment a címedre. a válasz címedre elküldöm :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

lili_ képe

ha megvan a hiba akkor én is kíváncsi lennék a kódra, lécci rakd fel ill rakjátok fel a keresés feldolgozást is

már nagyon várom

0
0

mini

lili_ képe

ha megvan a hiba akkor én is kíváncsi lennék a kódra, lécci rakd fel ill rakjátok fel a keresés feldolgozást is

már nagyon várom

0
0

mini

lili_ képe

a Te kódodból először is hiányzott egy ( jel a $items['om_kereso'] = array kódsorod végén,

nekem így működik csak egy kicsit más a modulom neve de az ne zavarjon téged

function ahahdemo_menu() {
 
  $items = array();
 
 
$items['om_kereso'] = array(
    'title' => 'OM kereső',
    'page callback' => 'ahahdemo_om_kereso_oldal',
    'description' => t('keresés'),
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}
 
function ahahdemo_om_kereso_oldal_form(&$form_state){
 
 
 $form = array();
 
    $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('om keresés'),
  );
    $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
  );
 
  return $form;
 
 
}
 
function ahahdemo_om_kereso_oldal(){
$h="";
 
$h.="alma";
 
$l=drupal_get_form("ahahdemo_om_kereso_oldal_form");
 
$h.="<br/>";
 
$h.=$l;
 
return $h;
 
}
0
0

mini

Sir_Csavar képe

gebasz van. most egy az egyben bepakoltam a tiedet. de arra is az oldal nem található hiba jön elő.

esetlegesen mik lehetnek még a hiba források?

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

lili_ képe

nekem a modul nevem nem ugyanaz, mint amit te használtál!!!!

vagyis ügyelj a fvényneveimre!!!! írd át a tiedre, de a kódrészlet ugye az maradhat úgy ahogy van

cache-t ürítettél, bár anno írták mások is

0
0

mini

Sir_Csavar képe

király, volt egy kisebb elírás ami... a lényeg, hogy nem vettem észre. :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

lili_ képe

de ha sikerül a keresés is megvalósítanod remélem leközlöd:)

én nagyon akarom látni

0
0

mini

Sir_Csavar képe

összejön akkor nagyon szívesen :D márpedig sikerülni fog most már akkor is!!! :D

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

Nah, hali megint mindenkinek

Sir_Csavar ígértem, elkészítettem ^^ használd egészséggel

Még annyi megjegyzés, hogy beletettem egy autocomplete-et is :)

<?php 
function om_kereso_menu() {
  $items = array();
  $access = array('access content');
 
  $items['om_kereso'] = array(
    'title' => t("Keresés"),
    'weight' => 0,
    'page callback' => 'om_kereso_page',
    'access arguments' => $access,
    'type' => MENU_NORMAL_ITEM
  );
 
  $items['custom/autocomplete'] = array(
    'page callback' => 'om_kereso_data_autocomplete',
    'access arguments' => $access,
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
 
  return $items;
}
 
function om_kereso_form(&$form_state) {
  $form['#redirect'] = FALSE;
 
  $form['om_kereso'] = array(
    '#type' => 'textfield',
    '#title' => 'Keresés az OM title-ben',
    '#autocomplete_path' => 'custom/autocomplete'
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Mehet')
  );
 
  return $form;
}
 
 
function om_kereso_page() {
  $output = drupal_get_form('om_kereso_form');
 
  if(!empty($_POST['om_kereso'])) {
    $keresendo_szo = $_POST['om_kereso'];
    $result = db_query("SELECT n.title FROM node n WHERE n.title LIKE '%$keresendo_szo%' AND n.status = 1"); //ide jöjjön az sql lekérdezésed
 
    $items = array();
 
    while($record = db_fetch_array($result)) {
      $items[] = $record['title'];
      //ide jön az adatok összegyűjtése;
    }
    if (!empty($items)) {
      $output .= theme('item_list', $items, 'A keresés eredménye', 'ul');
 
    }
    else {
      $output .= drupal_set_message('Nem találtam a keresett szó alapján semmit se', 'status', TRUE);
    }
  }
 
  return $output;
}
 
function om_kereso_data_autocomplete($node = '') {
  $matches = array();
  $result = db_query("SELECT n.title FROM node n WHERE n.title LIKE '$node%' AND n.status = 1");
    while ($record = db_fetch_object($result)) {
      $matches[$record->title] = check_plain($record->title);
    }
  print drupal_to_js($matches);
  die;
}
?>
0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

hatalmas respectel tartozom! hálám a sír után is üldözni fog!

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Lavjaman képe

Jössz egy sörrel :D

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

meg ilyen könnyen ;) postán kéred vagy személyesen? :D

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

pp képe

Sziasztok!

Kérlek olvassátok el a drupal coding standard-ot valamint a "hogyan írjunk biztonságos kódot" című részt!

    $result = db_query("SELECT n.title FROM node n WHERE n.title LIKE '%%%s%%' AND n.status = 1", $keresendo_szo);
 ...
 $result = db_query("SELECT n.title FROM node n WHERE n.title LIKE '%s%%' AND n.status = 1", $node);

Ez a két javítás elengedhetetlen a kód biztonságos működéséhez!

Pár javaslat:
Javasolt a {} burkoló használata a táblanevek körül.
Én az autocomplet függvényben a $node helyett valami beszédesebb változónevet használnék (pl. $szotoredek) mivel a $node változó általában egy egész nodeot tartalmaz.
Ezt a fajta megoldást csak kis, pár ezres node darabszámnál használnám. Felette valami optimálisabb megoldásra lesz szükségetek.

pp

0
0
Lavjaman képe

ismerem a coding standard-ot, csak a feladat egyszerűsége és alacsony adatmennyisége miatt tulajdonképpen feleslegesnek éreztem.

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

pp képe

Alaptézis, hogy a felhasználótól jövő adatot ellenőrzés nélkül nem használjuk fel sehol. Biztos ami biztos (vagyis coding standard) mindig a megfelelő formulát kell használni, mert nem tudhatod, hogy később nem fog-e az adat a felhasználótól érkezni. A legpraktikusabb az a szemlélet, hogy a függvényen kívülről érkező adatokat (paraméter, adatbázis lekérdezés) mindig a felhasználótól jövő adatnak tekintünk. Mint írtam azonban a függvényen belülről jövő adatnál is mindig a megfelelő biztonságos formulát használom, mert ha még most jó is egy későbbi átíráskor nagy gubanc lehet. Ez az amire mondhatod azt egy hetes fejlesztői tapasztalattal, hogy felesleges. Egy hónap múlva már biztos nem mondasz ilyen ormótlan nagy butaságot erre se. Tudni fogod, hogy ez egyáltalán nem felesleges.

Ebben az esetben viszont Te egyértelműen a felhasználótól jövő adatot tolod bele a lekérdezésbe. Tehát biztosan csináltál egy lyukat a rendszereden, nem csak elméletben és nem csak később lesz ezzel problémád, hanem azonnal. A fent írt kód egy lyuk a rendszereden, nem egy lehetséges támadási felület, hanem annál jóval több, egy nyitva tátongó hatalmas kapu!

Tehát itt nem szépészeti problémáról van szó, hanem egy alapvetően hibás kódról. Itt Te a minimálisan elvárható biztonságra sem ügyelsz. Az ilyen hozzáállást én nagyon sürgősen elfelejteném és a saját érdekemben megváltoztatnám a kódolási szokásaimat. Lehet hihetetlen, de akkor leírom: Ne csak olvasd el, hanem tartsd is be, azokat a szabályokat.

pp

0
0
Lavjaman képe

yeah, wathever....

holnap kijavítva berakom ide

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

Sir_Csavar képe

a segítséget! az mitől függ, hogy mennyi '%' jel kell?
végülis, ha egy string karaktersorozatot várok akkor nem elég csak '%s'?

a másik kérdés, {} azon kívül, hogy ellátja prefixummal a táblát jó még valamire, vagy csak a coding standard része?

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

pp képe

az mitől függ, hogy mennyi '%' jel kell?

Attól mit akarsz. Ha azt akarod, hogy '%alma' akkor az alma helyett kell %s és a % helyett kell %%.

végül is, ha egy string karaktersorozatot várok akkor nem elég csak '%s'?

Akkor igen, de Te itt az sql mondatban is használsz % jelet. (nézz utána az SQL kézikönyv LIKE-ról szóló fejezeténél)

a másik kérdés, {} azon kívül, hogy ellátja prefixummal a táblát jó még valamire, vagy csak a coding standard része?

Első közelítésben igen, de nem mernék rá megesküdni, hogy később valaki valamiért nem fogja kihasználni azt, hogy ezt mindig kötelezően ki kell tenni. Pl. bizonyos funkciók nem mennek, ha nem nagy betűvel írod az SQL kulcsszavakat. Szóval ez nem csak olyan "nézzen ki szépen a kód" hóbort.

Nem szabad továbbá elfelejteni, hogy a szabad szoftver az mindig egy közös alkotás színtere, ezért érdemes a közösség által kitalált játékszabályok szerint játszani. Még akkor is, hogyha most úgy tűnik a kódodat nem fogod megosztani... mert mint látjuk már meg is osztottad. ;)

pp

0
0
Lavjaman képe

Üdv megint,

Kijavítottam a hibákat, használjátok egészséggel

<?php
function om_kereso_menu() {
  $items = array();
  $access = array('access content');
 
  $items['om_kereso'] = array(
    'title' => t("Keresés"),
    'weight' => 0,
    'page callback' => 'om_kereso_page',
    'access arguments' => $access,
    'type' => MENU_NORMAL_ITEM
  );
 
  $items['custom/autocomplete'] = array(
    'page callback' => 'om_kereso_data_autocomplete',
    'access arguments' => $access,
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
 
  return $items;
}
 
function om_kereso_form(&$form_state) {
  $form['#redirect'] = FALSE;
 
  $form['om_kereso'] = array(
    '#type' => 'textfield',
    '#title' => 'Keresés az OM title-ben',
    '#autocomplete_path' => 'custom/autocomplete'
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Mehet')
  );
 
  return $form;
}
 
 
function om_kereso_page() {
  $output = drupal_get_form('om_kereso_form');
 
  if(!empty($_POST['om_kereso'])) {
    $keresendo_szo = $_POST['om_kereso'];
    $result = db_query("SELECT n.title FROM {node} n WHERE n.title LIKE '%%%s%%' AND n.status = 1, $keresendo_szo"); //ide jöjjön az sql lekérdezésed
 
    $items = array();
 
    while($record = db_fetch_array($result)) {
      $items[] = $record['title'];
      //ide jön az adatok összegyűjtése;
    }
    if (!empty($items)) {
      $output .= theme('item_list', $items, 'A keresés eredménye', 'ul');
 
    }
    else {
      $output .= drupal_set_message('Nem találtam a keresett szó alapján semmit se', 'status', TRUE);
    }
  }
 
  return $output;
}
 
function om_kereso_data_autocomplete($toredek= '') {
  $matches = array();
  $result = db_query("SELECT n.title FROM {node} n WHERE n.title LIKE '%s%%' AND n.status = 1, $toredek");
    while ($record = db_fetch_object($result)) {
      $matches[$record->title] = check_plain($record->title);
    }
  print drupal_to_js($matches);
  die;
}
?>

Nyah, örvendtem

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*