if внутри запроса

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ага, для таких ленивых надо не мануал, а человека с железной линейкой.
 

peretc001

Новичок
можно кого-нибудь долбануть железной линейкой, чтоб он мне подсказал:

PHP:
$firstname = $db->safesql(strip_tags(stripslashes($_POST['firstname'])));
ошибка Call to undefined method SafeMySQL::safesql() in /var/www...

как правильно очистить через safesql?
 

Фанат

oncle terrible
Команда форума
Я же говорил, что не осилит.
Там же надо в примерах читать, как подключаться.
И как данные подставлять.
И какие функции использовать, а не из головы выдумывать
 

peretc001

Новичок
PHP:
include 'safemysql.class.php';
$db = new SafeMySQL();
   
$table = "user";
$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid','date');
$data    = $db->filterArray($_POST,$allowed);
$sql    = "INSERT INTO ?n SET ?u";
$db->query($sql,$table,$data);
Все работает. Вопрос только как вписать переменную $sid и $date, чтобы не присваивать и не передавать их через пост
Если сделать так, то работает
PHP:
$_POST['date'] = date('Y-m-d H:i:s'); // дата и время
$sid = htmlspecialchars(trim($_GET['sid']));
$_POST['sid'] = $sid; // сессия
но это как-то криво
 

peretc001

Новичок
PHP:
$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid'=>$sid,'date'=>$date);
так не работает
 

peretc001

Новичок
и как добавить туда ON DUPLICATE KEY UPDATE
PHP:
$sql    = "INSERT INTO ?n SET ?u ON DUPLICATE KEY UPDATE ?u";
не работает, ошибка:
Uncaught exception 'Exception' with message 'SafeMySQL: Number of args (2) doesn't match number of placeholders (3) in [INSERT INTO ?n SET ?u ON DUPLICATE KEY UPDATE ?u]' in W:\home\partadami\www\shop\inc\safemysql.class.php:580 Stack trace: #0 W:\home\partadami\www\shop\inc\safemysql.class.php(464): SafeMySQL->error('Number of args ...') #1 W:\home\partadami\www\shop\inc\safemysql.class.php(127): SafeMySQL->prepareQuery(Array) #2 W:\home\...\www\shop\inc\zakaz2.php(17): SafeMySQL->query('INSERT INTO ?n ...', 'user', Array) #3 {main} thrown inW:\home\partadami\www\shop\inc\safemysql.class.php on line 580

типа аргументы не совпадают с плейсхолдом? как сделать чтоб совпадали?
 

peretc001

Новичок
PHP:
$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid'=>$sid,'date'=>$date);
так не работает
Это решил:

PHP:
session_start();
$sid = htmlspecialchars(trim($_GET['sid'])); # Достаем sid
$date = date('Y-m-d H:i:s'); // дата и время

$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid','date');
$data    = $db->filterArray($_POST,$allowed);
$sql    = "INSERT INTO ?n SET sid='$sid', date='$date', ?u";
$db->query($sql,$table,$data);
 

WMix

герр M:)ller
Партнер клуба
Код:
session_start();
$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid','date');
$data    = $db->filterArray($_POST,$allowed);
$data['sid'] = htmlspecialchars(trim($_GET['sid'])); # Достаем sid
$data['date'] = date('Y-m-d H:i:s'); // дата и время
$sql    = "INSERT INTO ?n SET ?u";
$db->query($sql,$table,$data);
 

Фанат

oncle terrible
Команда форума
PHP:
$allowed = array('firstname','lastname','middlename','phone','email','city','msg','sid','date');
$data = $db->filterArray($_POST,$allowed);
$sql = "INSERT INTO ?n SET sid=?s, date=?s, ?u";
$db->query($sql,$table,$sid, $date, $data);
 

peretc001

Новичок
ON DUPLICATE KEY UPDATE решил
PHP:
$data = array('firstname' => $_POST['firstname'], 'lastname' => $_POST['lastname'], 'middlename' => $_POST['middlename'], 'phone' => $_POST['phone'], 'email' => $_POST['email'], 'city' => $_POST['city'],'msg' => $_POST['msg']);
$sql  = "INSERT INTO user SET id=?i, sid='$sid', date='$date',?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$id,$data,$data);
только если какое-то значение Null выдает ошибку.
Как ее обойти?

ошибка:
Fatal error: Uncaught exception 'Exception' with message 'SafeMySQL: Column 'lastname' cannot be null. Full query: [INSERT INTO user SET id=NULL, sid='fp7g5an749552ml0qdi4fr8405', date='2015-05-27 14:20:47',`firstname`='name',`lastname`=NULL,`middlename`=NULL,`phone`='8-123-111-11-11',`email`='[email protected]',`city`='city',`msg`='123' ON DUPLICATE KEY UPDATE `firstname`='login',`lastname`=NULL,`middlename`=NULL,`phone`='8-123-111-11-11',`email`='[email protected]',`city`='city',`msg`='123']' in W:\home\...\www\shop\inc\safemysql.class.php:580 Stack trace: #0 W:\home\...\www\shop\inc\safemysql.class.php(450): SafeMySQL->error('Column 'lastnam...') #1 W:\home\...\www\shop\inc\safemysql.class.php(127): SafeMySQL->rawQuery('INSERT INTO use...') #2 W:\home\...\www\shop\inc\zakaz2.php(24): SafeMySQL->query('INSERT INTO use...', NULL, Array, Array) #3 {main} thrown in W:\home\...\www\shop\inc\safemysql.class.php on line 580

И я так понял что ON DUPLICATE KEY UPDATE по id проверяет запись, если есть то обновляет.
Как мне определить id?
PHP:
$id = $db->getOne('SELECT id FROM user WHERE sid = "$sid" and id = ?i',$_GET['id']);
так не работает
 

peretc001

Новичок
только увидел, исправляю sid и date
PHP:
$data = array('firstname' => $_POST['firstname'], 'lastname' => $_POST['lastname'], 'middlename' => $_POST['middlename'], 'phone' => $_POST['phone'], 'email' => $_POST['email'], 'city' => $_POST['city'],'msg' => $_POST['msg']);
$sql  = "INSERT INTO user SET id=?i, sid=?s, date=?s, ?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$id,$sid,$date,$data,$data);
 

peretc001

Новичок
вот так работает, это правильно?
PHP:
$id = $db->getOne('SELECT id FROM user WHERE sid=?s',$sid);
echo $id дает тот который надо.
А вот если еще нет id (нет такого пользователя) то выдает ошибку. Как ее обойти?
 

peretc001

Новичок
решил:
PHP:
$id = $db->getOne('SELECT id FROM user WHERE sid=?s',$sid);
if ($id == NULL) { # у вас в примере (http://phpfaq.ru/examples) почему три равно $var === NULL
  $sqlpart = "";
} else {
  $sqlpart = $db->parse("field = ?s", $id);
}

$_POST['lastname'] = '1';
$_POST['middlename'] = '2';
$data = array('firstname' => $_POST['firstname'], 'lastname' => $_POST['lastname'], 'middlename' => $_POST['middlename'], 'phone' => $_POST['phone'], 'email' => $_POST['email'], 'city' => $_POST['city'],'msg' => $_POST['msg']);
$sql  = "INSERT INTO user SET id=?s, sid=?s, date=?s, ?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$id,$sid,$date,$data,$data);
Осталось решить если кокой-то из $_POST равен null
 

Фанат

oncle terrible
Команда форума
только если какое-то значение Null выдает ошибку.
Это вопрос к структуре БД
Если там может не быть значения, то тогда сделай эту колонку NOT NULL.
А если нужно сделать дефолтное, то тогда и задай его. Пусткую строку например.

Ты вообще не о том думаешь! Ты думаешь только о том, как бы от ошибки избавиться, как собачка, которой консервную банку к хвосту привязали. А ДОЛЖЕН ты думать о том, что у тебя в базе будет в результате запроса.

Что у тебя в базе должно быть, если было передано поле NULL?
 
Сверху