Имя: Пароль:
IT
Веб-мастеринг
Массив в хранимой процедуре
,
0 antihacker
 
12.03.18
13:55
Всем привет ! Я так понял нельзя из PHP передать массив в харимую процедуру. Как тогда можно это передатьв массив nomenclature в харимую процедуру ?


$nomenclature_list = array();

$www = '{"nomenclature": [{"nom_name":"aaaaaaaaaaaaaaaaaaaaa","nom_unit":"hhhhhhhh","nom_price":350.50,"nom_status":2}, {"nom_name":"545555","nom_unit":"iiii","nom_price":555.00,"nom_status":2}]}';

$www1 = json_decode($www, true);

foreach ($www1 as $person_name => $person_a)
{

foreach($person_a as $inner_key => $value)
{
$nomenclature_list[] = array
(
'nom_name' => $value['nom_name']
);
}

}
1 antihacker
 
12.03.18
13:58
Ой $nomenclature_list
2 antihacker
 
12.03.18
14:01
Или сразу передать JSON )
3 antihacker
 
13.03.18
12:26
Помогите пожалуйста.
Вот код

    $ddd ='[{"nom_id":15745,"nom_name":"aaaaaaaaaaaaaaaaaaaaa","nom_unit":"hhhhhhhh","nom_price":350.50,"nom_status":2}, {"nom_id":15756,"nom_name":"545555","nom_unit":"iiii","nom_price":555.00,"nom_status":2}]';
  
    $mysqli->query("CALL prc_mass_nom_update(" . $ddd . ")") or die ("Query fail: " . mysqli_error($mysqlicon));

Не работает, потому что не может принять параметр.
А если открыть PHPMYADMIN и там запустить процедуру и вставить $ddd, то все работает прекрасно.

Как правильно передать в хранимую процедуру MYSQL ?

В хранимой процедуре только один входящий параметр. Больше ничего. Тип параметра JSON.
4 FIXXXL
 
13.03.18
12:35
(3) ты из 1С передаешь? или 1С тут нипричем?
5 Asmody
 
13.03.18
12:36
(4) А где в теме про 1С?
6 FIXXXL
 
13.03.18
12:37
(5) вот и я спрашиваю "где?" :)
7 FIXXXL
 
13.03.18
12:37
сорри, секцию не глянул
8 antihacker
 
13.03.18
12:38
Это же раздел вебматсеринг
9 Fragster
 
гуру
13.03.18
12:58
сообщение об ошибке товарищ майор будет читать? пусть он тогда и помогает.
10 Fragster
 
гуру
13.03.18
13:00
ну и экранирование символов никто не отменял
11 antihacker
 
13.03.18
13:02
В том и дело, что оштбка ничегоне показывает. елси имел ввиду mysqli_error($mysqlicon));
12 antihacker
 
13.03.18
13:06
А как экранировать ?
13 antihacker
 
13.03.18
13:14
Точнее как привести в такой вид ?

'[{\"nom_id\":15745,\"nom_name\":\"cccccc h88888 XXXX\",\"nom_price\":666.00,\"nom_status\":1}, {\"nom_id\":15756,\"nom_name\":\"aaaaaaaaaaaa**********\",\"nom_price\":350.50,\"nom_status\":1}]'
14 Fragster
 
гуру
13.03.18
14:44
15 Fragster
 
гуру
13.03.18
14:45
ну и использовать вместо объекта прямо строку - это как-то не по человечески.
16 Fragster
 
гуру
13.03.18
14:45
ну, или вместо хэшмассива
17 Fragster
 
гуру
13.03.18
14:46
в общем похапэшного array
18 Fragster
 
гуру
13.03.18
14:47
ну и использовать подстановку в текст запроса как в (0) - прямой путь к sql injection
19 Asmody
 
13.03.18
14:57
$sql = 'CALL prc_mass_nom_update(?)';
$param = json_encode(<тут твой массив>);
$stmt = $mysqli->stmt_init();
if (($stmt->prepare($sql) === FALSE)
|| ($stmt->bind_param('s', $param) === FALSE)
|| ($stmt->execute() === FALSE)
|| (($result = $stmt->get_result()) === FALSE)
|| ($stmt->close() === FALSE)
) {
  die('Select Error (' . $stmt->errno . ') ' . $stmt->error);
}
$row = $result->fetch_row();
echo $row[0];
20 Asmody
 
13.03.18
15:01
(19)+ Код поправил. Обновите.