21

Re: Пошук на PHP+MySQL

221VOLT написав:
VTrim написав:

Не використовуйте глобальні змінні global, передавайте об'єкт з'єднання з бд в аргумент функції.

можете написати коротеньке пояснення - чому? якщо можете - з невеличким прикладом)

тому що працює повільніше?
тому що є можливість підставили ліві дані?


Тому,що змінна доступна у будь-якому місці програми.. це лишня витрата памяті та якщо проект великий,то завжди є варіант,що вона десь буде конфліктувати з такою ж змінною.

Подякували: 221VOLT, Monolith, leofun013

22 Востаннє редагувалося 221VOLT (27.12.2015 17:18:32)

Re: Пошук на PHP+MySQL

VTrim написав:

У вас маса помилок і застарілий код..
Наведу вам приклад простого пошуку на об'єктно орієнотованому mysql(i) з використанням підготовчих виразів та іменованих параметрів для уникнення SQL ін'єкцій і filter_var для уникнення XSS.

$db = new mysqli('localhost', 'login', 'password', 'database');
if($db->connect_errno) exit('Помилка підключення: '.$db->connect_error);

if(isset($_GET['search']) && !empty($_GET['search'])) {

$searchText = '%'.$_GET['search'].'%';

$search = $db->prepare("SELECT * FROM users WHERE name LIKE ? OR last_name LIKE ?");
$search->bind_param('ss', $searchText, $searchText);  
$search->execute(); 
$result = $search->get_result();
if($result->num_rows > 0) {
echo 'Результати пошуку: <br/>';
while($out = $result->fetch_object()) {
$login = filter_var($out->login, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
echo $login.'<br/>';
}
}
else {
  echo 'Нічого не знайдено.';
}

}
else {
echo '<form method="GET">
      <input type="text" name="search">
      <input type="submit" value="Пошук">
      </form>';
}

функціональним стилем )))

$db = mysqli_connect('localhost', 'login', 'password', 'database');
if(mysqli_connect_errno()) exit('Помилка підключення: '.mysqli_connect_error());

if(isset($_GET['search']) && (!empty($_GET['search']))) {

$searchText = '%'.$_GET['search'].'%';

$search = mysqli_prepare($db, "SELECT * FROM users WHERE name LIKE ? OR last_name LIKE ?");
mysqli_stmt_bind_param('ss', $searchText, $searchText);  
mysqli_stmt_execute($search);
/* //так можна привязати значення стовпців з бд до змінних, кількість змінних повинна дорівнювати кількості стовпців(якщо я не помиляюся)
mysqli_stmt_bind_result($search, $s1, $s2, $s3);
*/

if(mysqli_num_rows($search) > 0) {
echo 'Результати пошуку: <br>';
while($out = mysqli_stmt_fetch($search)){
/*якщо ми вставляли у бд html-теги без перетворення і хочемо щоб вони вивелися на сторінці як текст, а не як теги/не ламали сторінку,, інакше напевно можна просто вивести*/
$login = htmlspecialchars($out['login'], ENT_QUOTES);
echo $login.'<br>';
}
mysqli_stmt_close($search);
mysqli_close($db);
}else{
  echo 'Нічого не знайдено.';
}

}else{
echo '<form method="GET">
      <input type="text" name="search">
      <input type="submit" value="Пошук">
      </form>';
}

filter_var з FILTER_SANITIZE_FULL_SPECIAL_CHARS === еквівалентно htmlspecialchars з ENT_QUOTES,
проте стосовно XSS напевно варто більше думати при збереженні у бд, ніж при вибірці))

Подякували: VTrim1

23

Re: Пошук на PHP+MySQL

VTrim написав:

Тому,що змінна доступна у будь-якому місці програми.. це лишня витрата памяті та якщо проект великий,то завжди є варіант,що вона десь буде конфліктувати з такою ж змінною.

погоджуюсь)
хоча зазвичай підключення до бази даних лише одне)
також я десь чув що є можливість підставити ліві дані,
взагалі їх раза два тільки використовував (=

Подякували: VTrim1

24

Re: Пошук на PHP+MySQL

221VOLT написав:
VTrim написав:

Тому,що змінна доступна у будь-якому місці програми.. це лишня витрата памяті та якщо проект великий,то завжди є варіант,що вона десь буде конфліктувати з такою ж змінною.

погоджуюсь)
хоча зазвичай підключення до бази даних лише одне)
також я десь чув що є можливість підставити ліві дані,
взагалі їх раза два тільки використовував (=

Мабуть Ви мали на увазі це.. (register globals)
http://citforum.ck.ua/internet/php/register_globals/

Подякували: 221VOLT1

25

Re: Пошук на PHP+MySQL

VTrim написав:

Мабуть Ви мали на увазі це.. (register globals)
http://citforum.ck.ua/internet/php/register_globals/

так, дякую)

Подякували: Monolith1

26

Re: Пошук на PHP+MySQL

221VOLT написав:
VTrim написав:

У вас маса помилок і застарілий код..
Наведу вам приклад простого пошуку на об'єктно орієнотованому mysql(i) з використанням підготовчих виразів та іменованих параметрів для уникнення SQL ін'єкцій і filter_var для уникнення XSS.

$db = new mysqli('localhost', 'login', 'password', 'database');
if($db->connect_errno) exit('Помилка підключення: '.$db->connect_error);

if(isset($_GET['search']) && !empty($_GET['search'])) {

$searchText = '%'.$_GET['search'].'%';

$search = $db->prepare("SELECT * FROM users WHERE name LIKE ? OR last_name LIKE ?");
$search->bind_param('ss', $searchText, $searchText);  
$search->execute(); 
$result = $search->get_result();
if($result->num_rows > 0) {
echo 'Результати пошуку: <br/>';
while($out = $result->fetch_object()) {
$login = filter_var($out->login, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
echo $login.'<br/>';
}
}
else {
  echo 'Нічого не знайдено.';
}

}
else {
echo '<form method="GET">
      <input type="text" name="search">
      <input type="submit" value="Пошук">
      </form>';
}

функціональним стилем )))

$db = mysqli_connect('localhost', 'login', 'password', 'database');
if(mysqli_connect_errno()) exit('Помилка підключення: '.mysqli_connect_error());

if(isset($_GET['search']) && (!empty($_GET['search']))) {

$searchText = '%'.$_GET['search'].'%';

$search = mysqli_prepare($db, "SELECT * FROM users WHERE name LIKE ? OR last_name LIKE ?");
mysqli_stmt_bind_param('ss', $searchText, $searchText);  
mysqli_stmt_execute($search);
/* //так можна привязати значення стовпців з бд до змінних, кількість змінних повинна дорівнювати кількості стовпців(якщо я не помиляюся)
mysqli_stmt_bind_result($search, $s1, $s2, $s3);
*/

if(mysqli_num_rows($search) > 0) {
echo 'Результати пошуку: <br>';
while($out = mysqli_stmt_fetch($search)){
/*якщо ми вставляли у бд html-теги без перетворення і хочемо щоб вони вивелися на сторінці як текст, а не як теги/не ламали сторінку,, інакше напевно можна просто вивести*/
$login = htmlspecialchars($out['login'], ENT_QUOTES);
echo $login.'<br>';
}
mysqli_stmt_close($search);
mysqli_close($db);
}else{
  echo 'Нічого не знайдено.';
}

}else{
echo '<form method="GET">
      <input type="text" name="search">
      <input type="submit" value="Пошук">
      </form>';
}

filter_var з FILTER_SANITIZE_FULL_SPECIAL_CHARS === еквівалентно htmlspecialchars з ENT_QUOTES,
проте стосовно XSS напевно варто більше думати при збереженні у бд, ніж при вибірці))

Погане ствердження. В бд прийнято зберігати дані в оригінальному вигляді,для подальшої можливої обробки. Так при записі в БД Ви заміните html теги на їхні безпечні сутності.
І якщо наприклад користувач буде робити пошук по сайту (якісь html теги) ,відповідно по БД,то нічого не знайде..

$a = filter_var('<b>', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // &lt;b&gt;
$b = '<b>'; // <b>
var_dump($a == $b); // bool(false)
Подякували: 221VOLT1

27

Re: Пошук на PHP+MySQL

VTrim написав:

Погане ствердження. В бд прийнято зберігати дані в оригінальному вигляді,для подальшої можливої обробки. Так при записі в БД Ви заміните html теги на їхні безпечні сутності.
І якщо наприклад користувач буде робити пошук по сайту (якісь html теги) ,відповідно по БД,то нічого не знайде..

$a = filter_var('<b>', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // &lt;b&gt;
$b = '<b>'; // <b>
var_dump($a == $b); // bool(false)

не зрозумів чому погане ствердження
при пошуку також перетворюємо і шукаємо - це не проблема

загалом про зберігання у оригінальному вигляді у бд я згоден,
проте я не можу вважати це повністю безпечним для даних які вводить користувач на сайті (потрібен так званий "захист від дурака", від "дрібненьких хацкерів" etc),
інше діло коли ми записує у бд "безпечні" дані - дані які пише адмін сайту, людина яка чітко знає що вона робить, у такому випадку я з вами згоден стосовно збереження даних "як є")

Подякували: Monolith1

28

Re: Пошук на PHP+MySQL

Справа в тому,що коли ми пишемо в бд,то важливо не допустити тільки SQL Inj, а не XSS.
І рівень знань хацкера тут ні до чого :)

Подякували: 221VOLT1

29

Re: Пошук на PHP+MySQL

Подивився я на це... І розумію, яке фреймворк щастя.

30 Востаннє редагувалося 221VOLT (29.12.2015 06:23:08)

Re: Пошук на PHP+MySQL

VTrim написав:

Справа в тому,що коли ми пишемо в бд,то важливо не допустити тільки SQL Inj, а не XSS.
І рівень знань хацкера тут ні до чого :)

можливо і так правильно)
на мою думку тут є два шляхи, і обидва мають право на існування (=

Sensetivity написав:

Подивився я на це... І розумію, яке фреймворк щастя.

кожному своє)
кому кількість, кому якість

Подякували: Monolith1