Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572

Что лучше PDO или же mysqli?

11.06.2019, 05:05. Показов 5309. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, какой способ лучше использовать для работы с базой данных mysqli или pdo? Я написала несколько примеров. Добавление, удаление и редактирование комментариев.
======================================== =============
mysqli
======================================== =============

index.php

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
     $mysqli = new mysqli("localhost", "root", "", "db_test");
    mysqli_set_charset($mysqli, 'utf8');
    header("Content-Type: text/html; charset=utf-8");
    
    $sql = "SELECT id, name, text FROM comment";
    $res = $mysqli->query($sql);
    
    if(!empty($_POST))
    {
    
       $name = $_POST["name"];
       $email = $_POST["email"]; 
       $text = $_POST["text"]; 
       if(!empty($name) && !empty($email) && !empty($text))
       {
          
          $mysqli->query("INSERT into comment(name,email,text) VALUES ('$name','$email','$text')");
          header("Location:/");
       }
    
    }
    while($row = $res->fetch_object())
    {
      echo "<table border=1><tr><td>$row->id</td><td width=\"500px\"><div>$row->name</div><div>$row->text</div></td><td><a href=\"/comm_edd.php?id=$row->id\">Редактировать</a><br><a href=\"/comm_del.php?id=$row->id\">Удалить</a></td></tr></table>";
    }
?>
<form action="" method="post">
 <p>Имя:<br>
  <input type="text" name="name" value="<?php echo $_REQUEST["name"];?>"></p>
  <p>Email:<br>
  <input type="text" name="email" value="<?php echo $_REQUEST["email"];?>"></p>
  <p>Сообщени:<br>
  <textarea type="text" rows=10 cols=30 name="text"><?php echo $_REQUEST["text"];?></textarea></p>
  <p><input type="submit" value="Добавить"></p>
</form>
comm_edd.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
   $mysqli = new mysqli("localhost", "root", "", "db_test");
    mysqli_set_charset($mysqli, 'utf8');
    header("Content-Type: text/html; charset=utf-8");
  
  $id = $_GET[id];   
 
  $sql = "SELECT id, name, email, text FROM comment WHERE id=$id";
  $res = $mysqli->query($sql);
  
  $row = $res->fetch_object();
  
  
  $id = $row->id;
  $name = $row->name;
  $email = $row->email;   
  $text = $row->text;  
  
  if(!empty($_POST))
  {
  
      $id = $_POST["id"];
      $name = $_REQUEST["name"];
      $email = $_REQUEST["email"];   
      $text = $_REQUEST["text"];   
    
     if(!empty($name) && !empty($email) && !empty($text))
     {
         $sql = "UPDATE comment SET name = '$name', email = '$email', text='$text' WHERE id=$id";
         $mysqli->query($sql);
         header("Location: /");
     }
     else
     {
      echo "Заполните все поля!";
     }
  }
?>
 
<form action="" method="post">
 
  <p>Имя:<br>
  <input type="text" name="name" value="<?php echo $name;?>"></p>
  <p>Email:<br>
  <input type="text" name="email" value="<?php echo $email;?>"></p>
  <p>Сообщени:<br>
  <textarea type="text" rows=10 cols=30 name="text"><?php echo $text;?></textarea></p>
  <input type="hidden" name="id" value="<?php echo $id; ?>">
  <p><input type="submit" value="Редактировать"></p>
</form>
comm_del.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 $mysqli = new mysqli("localhost", "root", "", "db_test");
  mysqli_set_charset($mysqli, 'utf8');
  header("Content-Type: text/html; charset=utf-8");
 $id = $_GET["id"];
 $sql = "SELECT id FROM comment WHERE id = $_GET[id]";
 $res = $mysqli->query($sql);
 
// if(mysqli_num_rows($res15) > 0)
 if(mysqli_num_rows($res) > 0)
 {
    $row = $res->fetch_object();
    $mysqli->query("DELETE FROM comment WHERE id = $row->id");
    header("Location:/");
 }
?>
======================================== ===================
PDO
======================================== ===================
index.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
    $dbh = new PDO('mysql:dbname=db_test;host=localhost','root','', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    header("Content-Type: text/html; charset=utf-8");
 
    
    $sth = $dbh->prepare("SELECT * FROM comment");
    $sth->execute();
    
    
    
    if(!empty($_POST))
    {
    
       $name = $_POST["name"];
       $email = $_POST["email"]; 
       $text = $_POST["text"]; 
       if(!empty($name) && !empty($email) && !empty($text))
       {
         $sth = $dbh->prepare("INSERT INTO comment SET name = :name, email = :email, text = :text");
         $sth->execute(array('name' => $name, 'email' => $email, 'text' => $text)); 
         header("Location:/");
       }
    
    }
    while ($row = $sth->fetch(PDO::FETCH_LAZY)) {
       echo "<table border=1><tr><td>$row->id</td><td width=\"500px\"><div>$row->name</div><div>$row->text</div></td><td><a href=\"/comm_edd.php?id=$row->id\">Редактировать</a><br><a href=\"/comm_del.php?id=$row->id\">Удалить</a></td></tr></table>";
    }
?>
 
<form action="" method="post">
 <p>Имя:<br>
  <input type="text" name="name" value="<?php echo $_REQUEST["name"];?>"></p>
  <p>Email:<br>
  <input type="text" name="email" value="<?php echo $_REQUEST["email"];?>"></p>
  <p>Сообщени:<br>
  <textarea type="text" rows=10 cols=30 name="text"><?php echo $_REQUEST["text"];?></textarea></p>
  <p><input type="submit" value="Добавить"></p>
</form>
comm_edd.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
    $dbh = new PDO('mysql:dbname=db_test;host=localhost','root','', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    header("Content-Type: text/html; charset=utf-8");
  
  $id = $_GET[id];   
 
  $sql = "SELECT id, name, email, text FROM comment WHERE id=:id";
  $sth = $dbh->prepare($sql);
  $sth->execute(array('id' => $id));
  $row = $sth->fetch(PDO::FETCH_LAZY);
  
  $id = $row->id;
  
  $name = $row->name;
 
  $email = $row->email;   
  $text = $row->text;  
  
  if(!empty($_POST))
  {
  
      $id = $_POST["id"];
      $name = $_REQUEST["name"];
      $email = $_REQUEST["email"];   
      $text = $_REQUEST["text"];   
    
     if(!empty($name) && !empty($email) && !empty($text))
     {
         $sth = $dbh->prepare("UPDATE comment SET name = :name, email = :email, text= :text WHERE id = :id");
         $sth->execute(array('name' => $name, 'email' => $email, 'text' => $text, 'id' => $id));
          header("Location: /");
     }
     else
     {
      echo "Заполните все поля!";
     }
  }
?>
 
<form action="" method="post">
  <p>Имя:<br>
  <input type="text" name="name" value="<?php echo $name;?>"></p>
  <p>Email:<br>
  <input type="text" name="email" value="<?php echo $email;?>"></p>
  <p>Сообщени:<br>
  <textarea type="text" rows=10 cols=30 name="text"><?php echo $text;?></textarea></p>
  <input type="hidden" name="id" value="<?php echo $id; ?>">
  <p><input type="submit" value="Редактировать"></p>
</form>
comm_del.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
  $dbh = new PDO('mysql:dbname=db_test;host=localhost','root','', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    header("Content-Type: text/html; charset=utf-8");
 
 $id = $_GET["id"];
 
 
  $sql = "SELECT id FROM comment WHERE id=:id";
  $sth = $dbh->prepare($sql);
  $sth->execute(array('id' => $id));
  
  
  
    $row = $sth->fetch(PDO::FETCH_LAZY);
   
    if(!empty($row->id))
    {
       $dbh->exec("DELETE FROM comment WHERE id = $id");
       header("Location:/");
    }
?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2019, 05:05
Ответы с готовыми решениями:

С чего начать: mysqli или PDO?
Всем привет!, начал изучать php и в области работы с БД возник большой вопрос. Прочитав несколько статей на разных форумах оказался в...

Использовать MySQLi или PDO для POST запроса
Всем привет господа. Помогите с POST запросом. Есть база Есть регистрация на сайте &lt;?php error_reporting(E_ALL); ...

Подскажите, как правильно работать с PDO / mysqli или Call to a member function query() on a non-object
Начинаю понемногу обучаться ООП. Ну раз ООП - так ООП и я решил попробовать объектно-ориентированный подход в работе с базами данных....

52
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
15.06.2019, 20:00  [ТС]
Студворк — интернет-сервис помощи студентам
И что они дают все функции с префиксом pg? Я могу отправлять любые запросы например mysql, mysqli, pdo?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
15.06.2019, 20:02
дают более качественную работу с БД в целом
и там нет всего этого mysql/PDO зоопарка
и прочих косяков
только один нюанс... это PostgreSQL
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
16.06.2019, 03:46  [ТС]
Что то я не могу понять как работает fetchColumn у PDO. Прописываю вот так
PHP
1
2
3
4
5
if ($sth->fetchColumn() > 0)
{
  $myrow = $sth->fetch(PDO::FETCH_ASSOC); 
  echo "Id: ".$myrow[id]; 
}
В теле цикла выводится id, а сам запрос не выводится. Пытаюсь разместить за телом цикла вот так:
PHP
1
2
3
4
5
6
if ($sth->fetchColumn() > 0)
{
  
}
$myrow = $sth->fetch(PDO::FETCH_ASSOC); 
echo "Id: ".$myrow[id];
То же самое не выводится запрос с параметром id.
Если разместить перед fetchColumn, то всё выводится мне нужно сделать как mysql_num_rows, чтобы через условия проверялись есть ли записи if(mysql_num_rows>0), а потом выводились данные. Как это можно сделать на PDO?
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
16.06.2019, 10:39
fetchColumn сдвигает курсор, т.е. следующий fetch будет идти начиная уже со второй записи.

Можно получить сразу многомерный массив через fetchAll и с помощью функции count() узнать количество строк. Либо можно сразу запустить $sth->fetch в цикле и когда он вернёт null - значит строк больше нет.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
16.06.2019, 15:08  [ТС]
Пытаюсь сформировать массив запроса, чтобы потом можно было с лёгкость добавлять данные прописываю только функцию, но почему-то вместо title='Статья' и author='admin', добавляется title='admin' и author='admin', т.е. в два поля добавляется admin.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php 
$dbh = new PDO('mysql:dbname=ajaxpage;host=localhost','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
header("Content-Type: text/html; charset=utf-8");
$arr = array('title'=>'Статья', 'author'=>'admin');   
 
insert($dbh,'posts',$arr);
function insert($dbh,$table,$arr)
{
 try{
        $query = 'INSERT INTO posts SET ';  
        $k = 0;  
        foreach ($arr as $field => $value){  
                $query .= ($k > 0 ? "," : "") . " `".$field."` = :".$field." ";  
                $k++;  
        }
        $sth = $dbh->prepare($query);  
        $k = 0;  
        $value = ''; 
        foreach($arr as $field => $value){  
            $k++; 
            $bind_placeholder = ':'.$field.'';  
            $sth->bindParam($bind_placeholder, $value);         
        }  
        $sth->execute(); 
 } catch(PDOException $e){
        throw new Exception($e -> getMessage() . "  " . get_class($this).' -> '.__METHOD__);
}
}
?>
Добавлено через 3 минуты
Извините за беспокойство, надо было массив в execute() указать вот так.
PHP
1
$sth->execute($arr);
Теперь работает как надо.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
16.06.2019, 15:16
Katerina1993, кроме именованных плейсхолдеров, есть еще и неименованные. Во многих случаях, особенно если вы делаете предварительную фильтрацию данных, их хватает с головой.

Добавлено через 6 минут
Тут главное порядок соблюдать: позиция элемента в массиве (его порядковый номер) соответствовать порядковому номеру плейсхолдера в строке запроса.
PHP
1
2
3
4
5
6
<?php
$data = ['Статья', 'admin'];
 
$query = "INSERT INTO `posts` SET `title` = ?, `author` = ?";
$sth = $dbh->prepare($query);
$sth->execute($data);
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
16.06.2019, 17:38  [ТС]
неименованные - т.е. это без ":name", просто вопросительный знак ?
Вот рабочий пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php 
$dbh = new PDO('mysql:dbname=ajaxpage;host=localhost','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION));
header("Content-Type: text/html; charset=utf-8");
 
insert($dbh, 'posts', array('title'=>'Статья', 'author'=>'admin','text'=>'Текст статьи'));
function insert($dbh,$table,$arr)
{
   try{
          $query = 'INSERT INTO '.$table.' SET ';  
          $k = 0; 
          $data = array(); 
          foreach ($arr as $field => $value){ 
                  $query .= ($k > 0 ? "," : "") . " `".$field."` = ? ";  
                  $data[]=$arr[$field];
                  $k++;  
          }
         $sth =$dbh->prepare($query);
         $sth->execute($data);
          
   } catch(PDOException $e){
        throw new Exception($e -> getMessage() . "  " . get_class($this).' -> '.__METHOD__);
  }
}
?>
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
16.06.2019, 18:01
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Вот рабочий пример
Это хорошо, но нужно ли гнаться за такой универсальностью - для меня вопрос крайне спорный.

P.S. Немного измененный ваш код функции (просто, как вариант).
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function insert($dbh, $table, $arr) {
  try {
    $query = "INSERT INTO `{$table}` SET " . implode(', ', array_map(function ($el) {
        return sprintf('`%s` = ?', $el);
      }, array_keys($arr)));
 
    $sth = $dbh->prepare($query);
    $sth->execute(array_values($arr));
 
  } catch (PDOException $e) {
    throw new Exception($e->getMessage() . "  " . get_class($this) . ' -> ' . __METHOD__);
  }
}
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
17.06.2019, 10:10  [ТС]
Lazy_Den, код получился короче чем у меня, я тут ещё написала select, таким же образом. Как можно пропустить функцию выборки через цикл, чтобы вывести несколько записей, но саму функцию трогать нельзя я её буду использовать для выборки одной записи например автора, статьи, даты и т.д?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
   $dbh = new PDO('mysql:dbname=ajaxpage;host=localhost','root','',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    header("Content-Type: text/html; charset=utf-8");
  
  $data = array("title","author","body");
  $order = array(array("id"),"DESC");
  
  function select($dbh, $table, $data, $where='', $order='')
  {
    $order1 = array();
    $where1 = array();
    $data1 = array();
    
    foreach($data as $key)
    {
       $data1[] = $key;
    }
    $fields = implode($data1,",");
   
    
    if(!empty($where))
    {
       foreach($where as $key=>$value)
       {
          if(is_string($value))
          {
            $q = "'".$value."'";  
          }
          if(is_numeric($value))
          {
            $q = $value;  
          }
          $where1[] = $key."=".$q;
       }
      $where2 = "WHERE ".implode($where1," AND ");
    }
    if(!empty($order))
    {
      foreach($order as $key)
      {
        if(is_array($key))
        {
           foreach($key as $value)
           {
              $order1[] = $value;
           }
        }
        else
        {
           $type = " ".$key.", ";
           $type_end = $key;
        }
      }
      $orderby = "ORDER by ".implode($order1,$type)." ".$type_end;
    }
    $query = "SELECT $fields FROM $table $where2 $orderby"; 
    
    $STH = $dbh->prepare($query);
    $STH->execute();
    $item = $STH->fetch(PDO::FETCH_ASSOC);
    return $item;
  } 
  $item = select($dbh,"posts",$data,$where,$order);
  echo $item[title];  
?>
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
17.06.2019, 12:22
Katerina1993, ох... куда-то вас заносит не в ту степь. Я уже говорил выше, что это совсем не та универсальность, за которую сто́ит бороться. Завтра (образно) у вас уже появиться проект, где даже INSERT не будет столь однозначным: в каких-то случаях внезапно нужно будет выполнить INSERT IGNORE ..., в каких-то INSERT ... ON DUPLICATE KEY UPDATE и т.д. А что уж говорить о SELECT, где вариаций, что звёзд на небе? Может вы сами того не зная, но уже используете ООП, ведь PDO - это класс. Так может быть вам лучше и двигаться в этом направлении?
Цитата Сообщение от Katerina1993 Посмотреть сообщение
пропустить функцию выборки через цикл
По существу вопроса. Не нужно ничего пропускать. Можете добавить еще один аргумент в вашу функцию, который будет сигнализировать о том, что нужна только одна запись или все:
PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
function select($dbh, $table, $data, $where='', $order='', $all = false)
{
    // ....
    $STH->execute();
    return $all ? $STH->fetchAll(\PDO::FETCH_ASSOC) : $STH->fetch(\PDO::FETCH_ASSOC);
}
// Одна запись
$item = select($dbh, "posts", $data, $where, $order);
// Все записи
$allItems = select($dbh, "posts", $data, $where, $order, true);
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
17.06.2019, 17:09  [ТС]
А в каких случаях могут пригодится сложные запросы? Просто у меня самый сложный запрос был это объединение двух таблиц при отправке сообщения в личку пользователя. Нужно было извлечь данные из таблицы account и данные из таблицы message, объединить их, а потом записать в общую таблицу с нужными параметрами получателя и отправителя.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
18.06.2019, 11:44  [ТС]
Выше написали, что старый вариант mysql не поддерживают placeholders и я подумала для чего вообще нужны плэйсхолдеры. Я почитала несколько статей на habr'e и php.net, и узнала что плэйсхолдеры защищают от sql инъекции, теперь не нужно искать аналог mysql_real_escape_string для pdo. И если в поисковики прописать "как защититься от sql инъекции php mysql", то старого варианта уже не будет все топовые статьи про placeholders.
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
18.06.2019, 11:45
Katerina1993, да именно так. Плейсхолдеры неплохая защита от sql инъекций.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.06.2019, 11:54
Цитата Сообщение от Katerina1993 Посмотреть сообщение
А в каких случаях могут пригодится сложные запросы?
Пригодится - не очень подходящее слово. Сложные запросы могут потребоваться.
Цитата Сообщение от Katerina1993 Посмотреть сообщение
теперь не нужно искать аналог mysql_real_escape_string для pdo
Одно другое не исключает. Фильтрацию данных никто не отменял, т.к. кроме sql-инъекций есть еще куча других пакостей. Как минимум, я бы посоветовал вам взять на вооружение функции фильтрации (filter_input / filter_input_array и т.д.) + подготавливаемые запросы, т.е. те самые плейсхолдеры. Это минимальный набор для хорошей защиты.
0
18.06.2019, 11:54

Не по теме:

теперь не нужно искать аналог mysql_real_escape_string для pdo
https://www.php.net/manual/ru/pdo.quote.php

0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
18.06.2019, 13:52  [ТС]
Какое совпадение я только, что закончила читать статью на habr'e и там было написано про quote. Они нужны только в том случае если я не использую prepared statements.

Добавлено через 9 минут
Lazy_Den, ваш ответ я сначала не заметила и поэтому ответила последнему посту.
Одно другое не исключает. Фильтрацию данных никто не отменял, т.к. кроме sql-инъекций есть еще куча других пакостей. Как минимум, я бы посоветовал вам взять на вооружение функции фильтрации (filter_input / filter_input_array и т.д.) + подготавливаемые запросы, т.е. те самые плейсхолдеры. Это минимальный набор для хорошей защиты.
Что такое фильтры типа проверка отправленных данных например на число и строку?
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.06.2019, 14:14
Цитата Сообщение от Katerina1993 Посмотреть сообщение
типа проверка отправленных данных
Проверка (валидация) и/или очистка. Тот или иной подход используется в зависимости от ситуации. Приведу пример:
PHP
1
2
3
4
5
6
7
<?php
// Проверяемые данные
$data = 'abc100';
// Валидация
var_dump(filter_var($data, FILTER_VALIDATE_INT)); // false
// Очистка
var_dump(filter_var($data, FILTER_SANITIZE_NUMBER_INT)); // 100
При валидации, если мы ожидаем числовое значение, а оно таковым не является, функция вернёт false. В то время, как при очистке, функция просто уберет всё лишнее, что числом не является. Пример очень грубый и примитивный, но мне главное было донести до вас суть. А дальше читайте документацию.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
19.06.2019, 16:52  [ТС]
При валидации, если мы ожидаем числовое значение, а оно таковым не является, функция вернёт false.
А как это может помочь при добавлении в базу данных? Вот я например добавила новое поле под названием price, где пользователь может добавить цену, теперь это поле нужно пропустить через фильтр, чтобы пользователи не могли добавлять буквы?
Пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
try
{
  $DBH = new PDO('mysql:dbname=ajaxpage;host=localhost','root','');
  $DBH->exec("set names utf8");
  header("Content-Type: text/html; charset=utf-8");
}
catch(PDOException $e) {
    echo "Обнаружена ошибка. Напишите администратору. $email<br>";  
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
 
 
 
if(!empty($_POST))
{
    $title = $_POST["title"];  
    
    $name = $_POST["author"];
    $text = $_POST["text"];
    $price = $_POST["price"];
   
    
    if (!filter_var($price, FILTER_VALIDATE_INT))
    {
       $price = filter_var($price, FILTER_SANITIZE_NUMBER_INT);
      
    }
 try {
    $STH = $DBH->prepare("INSERT INTO posts (title, author, text, price) VALUES (?, ?, ?, ?)");
    $STH->bindParam(1, $title);
    $STH->bindParam(2, $name);
    $STH->bindParam(3, $text);
    $STH->bindParam(4, $price);
    $STH->execute();
    }catch (\PDOException $e) {
                 echo "Обнаружена ошибка. Напишите администратору. $email";  
                 file_put_contents('PDOErrors.txt', $e->getMessage()."\n", FILE_APPEND);
   }
}   
?>
 
<form action="" method="post">
<p>Название<br>
<input type="text" name="title">
</p>
<p>Автор<br>
<input type="text" name="author">
</p>
<p>Цена<br>
<input type="text" name="price" value="0">
</p>Текст<br>
<textarea name="text" cols="40" rows="20"></textarea><br>
<input type="submit" name="submit">
</body>
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
19.06.2019, 17:04
Цитата Сообщение от Katerina1993 Посмотреть сообщение
А в каких случаях могут пригодитЬся сложные запросы?
на страницах отчётов по 5-10 таблиц свести в одну - запросто, да ещё со всякими извращениями
там часто без materialized view (а точнее агрегации) никак
в некоторых формах может быть по 50-100 полей, там запросы по 1-2-3 экрана
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
27.06.2019, 21:29  [ТС]
Решила опять вернуться к этой теме я искала инфу в сети как использовать подготовленные операторы, просто выше мне написали, что для хорошей защиты нужно применять фильтры данных filter_var () и вот в интернете нашла вот такой вопрос одного пользователя "Использование подготовленных операторов PDO и filter_var" https://stackoverflow.com/ques... filter-var и ему ответили "использование filter_var () не требуется, поскольку bindParam с флагом PDO::PARAM_INT будет выполнять ту же работу" и я думаю, что лучше записать вот так.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function type($value)
{
        if (is_int($value)) {
            $type = PDO::PARAM_INT;
        } elseif (is_string($value) || is_float($value)) {
            $type = PDO::PARAM_STR;
        } elseif (is_bool($value)) {
            $type = PDO::PARAM_BOOL;
        } elseif (is_null($value)) {
            $type = PDO::PARAM_NULL;
        } else {
            $type = false;
        }
        return $type;
}
 
 
 
insert($DBH, 'posts', array('title'=>'wadaw','show2'=>'hide','author'=>'admin','text'=>'Текст статьи'));
function insert($dbh, $table, $arr) {
  try {
  
  
    $query = "INSERT INTO `{$table}` SET " . implode(', ', array_map(function ($el) {
        return sprintf('`%s` = ?', $el);
      }, array_keys($arr)));
    
    $sth = $dbh->prepare($query);
    
    
    
    //$sth->execute(array_values($arr));
     foreach ($arr as $field => $value) 
     {
        $type = type($value);
        $sth->bindValue(':'.$field, $value,$type);     
     }
 
  } catch (PDOException $e) {
    throw new Exception($e->getMessage() . "  " . get_class($this) . ' -> ' . __METHOD__);
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2019, 21:29

На что лучше всего заменить MYSQLi ?
Добрый день, возник такой вопрос на что лучше всего заменить MYSQLi 1). Object Relational Mapper 2). Database Abstraction Layer ...

MySqli или PDO ?
Что выбрать?

MySQLi vs. PDO
Объясните, что лучше использовать для работы с MySQL, библиотеку MySQLi или PDO? Вся информация которую удалось найти противоречива. К...

PDO и MySQLi
Какой способ предпочтительнее использовать? В мануале смутило что PDO нужно собирать вместе с PHP и PDO настолько же хорошо...

Mysqli + PDO + кодировка
Здравствуйте. Не подскажите у кого проблема? У меня руки кривые или, что-то у хостера. Вот 2 запроса с разными интерфейсами. // Первый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
Теория всего 6. Судьба неотвратима?
anaschu 21.07.2026
Математическое доказательство Судьбы: Точка бифуркации в едином тензорном ядре Модели ВсегоСвежее обновление питоновского ядра «Soil Chemistry 2. 0» дало нам неопровержимое математическое. . .
Теория всего 5. ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли
anaschu 21.07.2026
Единое ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли Главная задача «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы» (аттракторов. . .
сукцессия 37. Внедрил дипсик в свой оркестр из ИИ. У него закончилось пространство чата, потому опубликую выводы из его работы здесь
anaschu 21.07.2026
==================================================================== КОНТЕКСТ: Моделирование микоризной сукцессии (AM → ECM) ==================================================================== . . .
сукцессия 36. Делаю прогоны модели около порога бифуркации (превращения эндо микоризы в экто микоризу)
anaschu 21.07.2026
СУКЦЕССИЯ МИКОРИЗ: КАК МАТЕМАТИКА ОБЪЯСНЯЕТ ПОДЗЕМНУЮ ВОЙНУ Мы привыкли думать, что лес — это деревья. А грибы — это то, что мы собираем в корзинку осенью. Но если заглянуть под землю, окажется,. . .
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru