SQL karbantartás keresés opcióval

makgab képe

hi!

Adott egy korábbi kódminta:

<?php
 
function listazas() {
  $header = array(
    array('data' => t('User name'), 'field' => 'u.name', 'sort' => 'asc'),
    array('data' => t('Mail'), 'field' => 'u.mail'),
    array('data' => t('Operations'), 'colspan' => 2),
  );
 
  $form['header'] = array(
   '#type' => 'value',
   '#value' => $header,
  );
 
  $sql = 'SELECT * FROM {users} u WHERE u.uid > 0';
  $sql .= tablesort_sql($header);
 
  $result = pager_query($sql, 50, 0);
 
  $form['user']['#tree'] = TRUE;
 
  while ($user = db_fetch_object($result)) {
    $form['user'][$user->uid] = users_row($user);
  }
 
  $form['pager'] = array('#value' => theme('pager', NULL, 50, 0));
  $form['#theme'] = 'listazas';
 
  return $form;
}
 
function users_row($user) {
  $form['name'] = array(
    '#type' => 'markup',
    '#value' => $user->name,
  );
  $form['mail'] = array(
    '#type' => 'markup',
    '#value' => $user->mail,
  );
  $edit_link = (0) ? '' : l(t('Edit'), 'lista/edit/'. $user->uid);
  $form['edit_user'] = array(
    '#type' => 'markup',
    '#value' => $edit_link,
  );
  $delete_link = (0) ? '' : l(t('Delete'), 'lista/delete/'. $user->uid);
  $form['delete_user'] = array(
    '#type' => 'markup',
    '#value' => $delete_link,
  );
 
  return $form;
}
 
function theme_listazas($form) {
  $header = $form['header']['#value'];
  $rows = array();
 
  foreach (element_children($form['user']) as $key) {
     // Build the table row.
    $rows[] = array(
      array('data' => drupal_render($form['user'][$key]['name'])),
      array('data' => drupal_render($form['user'][$key]['mail'])),
      array('data' => drupal_render($form['user'][$key]['edit_user'])),
      array('data' => drupal_render($form['user'][$key]['delete_user'])),
    );
  }
 
  $output = theme('table', $header, $rows);
  if ($form['pager']['#value']) {
    $output .= drupal_render($form['pager']);
  }
  $output .= drupal_render($form);
 
  return $output;
}
?>

Ezt hogyan célszerű módosítani, hogy a listázás fölé (v. alá mindegy) lehessen egy kereső "inputbox"-ot tenni egy submit button-nal, amire kattintva az SQL listát szűkíti.

G.

Drupal verzió: 
makgab képe

így oldottam meg:

<?php
 
// ez a menüpont már létezett a .module-ban
  $items['base/rendszer/user'] = array(
    'title' => t('Helyek'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('listazas'),
    'access callback' => 'user_access',
    'access arguments' => array('administer'),
    'file' => 'mymodule.inc',
  ); 
 
// hook_menu()-ben (.module) új menüpont
  $items['base/rendszer/user/lista/%'] = array(
    'title' => t('User'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('listazas2', 4),
    'access callback' => 'user_access',
    'access arguments' => array('administer'),
    'file' => 'mymodule.inc',
  ); 
 
// 'mymodule.inc' file
function listazas() {
  $form['k_nev'] = array(
  '#type' => 'textfield',
  '#title' => t('Keresés'),
  '#description' => t('Keresés a névben.'),
  );
  $form['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Search'), 
  // ... 
}
 
 
function listazas2( $form_state, $param ) {
  $form['k_nev'] = array(
  '#type' => 'textfield',
  '#title' => t('Keresés'),
  '#default_value' => $param,
  '#description' => t('Keresés a névben.'),
  );
  $form['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Search'), 
  // ...
  $sql = 'SELECT * FROM {users} u WHERE u.uid > 0 AND u.name LIKE "%' . $param . '%"';
  // ...
}
 
/*
 * userlistazas form
 */
function userlistazas_validate($form, &$form_state) {
}
 
function userlistazas_submit($form, &$form_state) {
  $param = $form_state['values']['k_nev'];
  $form_state['redirect'] = 'base/rendszer/user/lista/' . $param;
}
 
/*
 * userlistazas2 form
 */
function userlistazas2_validate($form, &$form_state) {
}
 
function userlistazas2_submit($form, &$form_state) {
  $param = $form_state['values']['k_nev'];
  $form_state['redirect'] = 'base/rendszer/user/lista/' . $param;
} 
 
 
?>

Működik, bár nem biztos hogy a legelegánsabb.

G.

0
0
lili_ képe

én átfutottam a kódot, érdekes :)
és értettem is hogyan is működne

én úgy szoktam vagy csinálom, h form-ba megadott szöveget, nevet stb. nem az URL-ben viszem át hanem használom a $_SESSION tömböt, és a form alapértéke a tömb megfelelő eleme lesz, csak figyelni kell, h be van-e állítva az értéke...
ez csak egy tipp, próbáld ki egyszer

0
0

mini

makgab képe

azért gondoltam a leírt megoldást, mert ez volt az ajánlás korábban.
itt a fórumon javasolták, hogy a drupal alapmoduljai is így működnek és nekem is tetszett. :)

G.

0
0
pp képe

Munkamenetben felhasználó állapotot szokás tárolni. Az oldal állapotát nem túl egészséges, mivel egy felhasználó futtathat egyszerre több böngésző ablakot is. (mint ahogyan én is teszem most ezt itt)

pp

0
0
makgab képe

vmi ilyesmire gondoltatok?

<?php
 
function userlistazas_submit($form, &$form_state) {
  $_SESSION['k_nev'] = $form_state['values']['k_nev'];
  $form_state['redirect'] = 'base/rendszer/user';
}
 
?>

Így nem kell külön menüpont, hanem az eredeti függvényben levizsgálni a $_SESSION['k_nev'] értékét.
Azt hiszem lili_ is erre gondolt.

A "nem túl egészséges"-el az esetleges SQL injection lehetőségére gondoltál?

G.

0
0
Den képe

De ez is oda volt írva:

Ha a keresés oldalad session-ben tárolja a keresés paramétereit, akkor nincs arra lehetőséged, hogy az oldal állapotát küldd el.

Példa: ha valakinek el akarsz küldeni egy keresési listát, hogy ha a híreket szűröd és azok közül is a publikáltakat, akkor a harmadik az az oldal, amit keresel. Ha session-ben utaznak az adatok, akkor lesz egy http:domain/search linked, ami semmi infót nem tartalmaz a keresés állapotáról, mert minden nálad van a saját sessionödben - a szűrés beállításai. Akinek küldöd annál nem lesz meg, mert saját, egyedi sessionje van.

Ellenben: http:domain/search/type/page/published/1 urlben benne van minden fontos adat, tőled függetlenül. Ha két böngésződ van nyitva (vagy két tab, és miért ne), akkor mindegyikben a /search/ url szerepel vagy http:domain/search/type/page/published/1 és http:domain/search/type/page/published/0.

Nem vesznek össze, de a lista más. Mert az url-ben benne van a lap állapota, az, hogy most szűrve van, és pontosan mely szempontok szerint.

0
0
makgab képe

egy kicsit megkeveredtem... :)
akkor az eredeti megoldásnál maradjak (url-ben átvitel)?

bocs!

G.

0
0
lili_ képe

maradhatsz nyugodtan, csak írtam h másképpen is lehet,
amint lesz időm majd írok egy kis rövidke példát...

0
0

mini

aboros képe

de nem úgy kell. :)

0
0

-
clear: both;

lili_ képe

akkor hogyan kell, ha már ennyire nem így

amúgy már megszoktam, h bármit is beírok nem így kell nem úgy kell
de ebbe nem megyek ismét bele
miért amit én javaslok mi a baj vele?
nálam szépen működik...

0
0

mini

Den képe

Nézd meg ezt az oldalt:
http://www.menetrendek.hu/cgi-bin/menetrend/html.cgi

Keresd ki a Pécs-Budapesi buszokat. Majd annak az url-jét küldd el nekem, hogy én is megnézhessem.

0
0
aboros képe

az is szépen működik, hogy phpt égetünk egy node bodyjába, mégse csináljuk, mert nem az a dolgok módja. hogy miért nem úgy kell, hogy sessionbe pakolászod, azt meg már elmagyarázták korábban, csak nem figyeltél vagy direkt nem akarod megérteni az okokat.

sokmindent lehet sokféleképpen, a legtöbb dologra vannak szabályok, hogy hogyan kell azt csinálni. van formAPI, vannak szabályai, nem véletlenül. amit a sessionnel bűvészkedsz lehet, hogy működik ugyan, de azért van a $form_state['values'] hogy azt használjad, mert a sessionos megoldás az gány.

0
0

-
clear: both;

lili_ képe

értem

0
0

mini

Yorirou képe

<?php
$sql = 'SELECT * FROM {users} u WHERE u.uid > 0 AND u.name LIKE "%' . $param . '%"';
?>

Ilyet nem csinálunk, mert ez egy biztonsági rés.
Ehelyett:

<?php
$sql = 'SELECT * FROM {users} u WHERE u.uid > 0 AND u.name LIKE \'%s\'';
...
db_query($sql, '%'.$param.'%');
?>
0
0
pp képe

Miért nem használsz "?
Miért rakod külön hozzá a % jelet?

$sql = "SELECT * FROM {users} u WHERE u.uid > 0 AND u.name LIKE '%%%s%%'";
...
db_query($sql, $param);

pp

0
0
york képe

A ' kiertekelese gyorsabb mint a " :) es nem ertekeli ki a belekevert valtozokat.
En az olvashatosag miatt hasznalom a lekerdezeseknel a ".
A % meg gondolom kevesebbet kell gepelni ;), de a te megoldasod szerintem olvashatobb.

0
0
pp képe

Érdekelne, hogy vajon a kód ezen része által okozott sebesség csökkenés miatti anyagi plusz költség hogyan aránylik a plusz munkaórák költségével ami az ilyen kód javításához szükséges. ;) Tehát nem mondanám azt, hogy felesleges vagy rossz beidegződés lenne ez, bár vannak olyan vélemények, hogy bizonyos esetekben nem gyorsabb a szimpla idézőjel. http://www.sematopia.com/2007/08/php-double-quotes-vs-single-quotes/#com... Szóval én ilyen esetben nem látom értelmét.

Arról meg most ne beszéljünk, hogy a db_query() úgy is rátol egy preg_replace_callback()-t ami nem a sebességéről híres. Ráadásul azon a lekérdezésen is van mit csiszolni (http://forge.mysql.com/wiki/Top10SQLPerformanceTips).

pp

0
0
Yorirou képe

1.) azért, mert biztosan nem akarom, hogy bármi is bele legyen helyettesítve a stringbe (tudom, hogy nincs benne olyan, de ez egy plusz jelzés, elsősorban magamnak)
2.) ez jogos

0
0