Jonaslhp 39 Denunciar post Postado Março 26, 2014 Ao criar a função inserir_pedidos(), voc6e está fazendo assim: function inserir_pedidos() { //... } E deve ser assim: function inserir_pedidos( $post ) { //... } Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado. Outro ponto é aqui: if ( empty( $cd_cliente ) || empty( $id_status ) ) { Deveria ser: if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) { E também não use o require_once('mysqli.php'); Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use: global $MySQLi; Logo no começo da função. ***Estes exemplos são apenas didáticos. Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 Olá Jonaslhp, A minha dúvida era exatamente como filtrar e tratar as os dados vindos do POST. Estou fazendo da seguinte forma: <?php /* apenas envia os pedidos */ require 'pedidos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'POST': //chama função para inserir pedidos $post = filter_input_array( INPUT_POST , array( 'cd_cliente' => FILTER_SANITIZE_STRING, 'id_status' => FILTER_SANITIZE_STRING, ) ); if ( count( $_POST ) > 0 && count( $post ) > 0 ) { echo inserir_pedidos( $post ); } else { echo json_encode( 'Post inválido' ); } break; default: echo json_encode( 'Método HTTP não permitido.' ); break; } <?php function inserir_pedidos() { require_once('mysqli.php'); $cd_cliente = $post['cd_cliente']; $id_status = $post['id_status']; if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) { return json_encode( 'Dados invalidos' ); } $sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');"; $query = mysqli_query( $sql ); if ( $query ) { return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) ); } } Mas está retornando "Dados inválidos". Já estava usando o Postman do Chorme para as requisições, mas o POST não funciona "/ TESTE NO CHORME: Ao criar a função inserir_pedidos(), voc6e está fazendo assim: function inserir_pedidos() { //... } E deve ser assim: function inserir_pedidos( $post ) { //... } Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado. Outro ponto é aqui: if ( empty( $cd_cliente ) || empty( $id_status ) ) { Deveria ser: if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) { E também não use o require_once('mysqli.php'); Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use: global $MySQLi; Logo no começo da função. ***Estes exemplos são apenas didáticos. FUNCIONOU ... segue os códigos: pedidos.php <?php /* apenas envia os pedidos */ require 'pedidos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'POST': //chama função para inserir pedidos $post = filter_input_array( INPUT_POST , array( 'cd_cliente' => FILTER_SANITIZE_STRING, 'id_status' => FILTER_SANITIZE_STRING, ) ); if ( count( $_POST ) > 0 && count( $post ) > 0 ) { echo inserir_pedidos( $post ); } else { echo json_encode( 'Post inválido' ); } break; default: echo json_encode( 'Método HTTP não permitido.' ); break; } pedidos_acoes.php <?php function inserir_pedidos($post) { require_once('mysqli.php'); $cd_cliente = $post['cd_cliente']; $id_status = $post['id_status']; if ( empty( $cd_cliente ) || empty( $id_status ) ) { return json_encode( 'Dados invalidos' ); } $sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');"; $query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR); if ( $query ) { return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) ); } } Muito obrigada pela ajuda.. vou marcar como Resolvido =D Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 26, 2014 Leu o post #21? Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 Leu o post #21? Li sim, mas só vi depois que tinha mandando o outro post.. desculpe rsrs Valeu pela ajuda o> Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 Uma última dúvida: Quando a requisição é por ID, é obrigatório que seja inteiro?Tenho uma tabela que o ID é o código do produto e nesse código pode existir letras entre os números. Exemplo: http://127.0.0.1/site/produtos/F000600188 O começo da minha função é esse: function listar_produto_por_id($id) { require_once('mysqli.php'); $id = (int)$id; $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'"; .... } Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 26, 2014 Não é obrigatório, usei no exemplo mais como um caguete (?) mesmo...No PHP + MySQL, costumo criar o ID sendo um campo numérico com auto incremento... Para validar, você pode fazer assim: $id = filter_var($id, FILTER_SANITIZE_STRING); $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'"; Ou ainda utilizar expressões regulares: $id = preg_replace("/[0-9a-z]/i", "", $id); $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'"; Com a expressão acima, o preg_replace vai limpar a variável retirando tudo que não for número ou letra de a-z.Enfim, pode fazer a validação que quiser, ou melhor, a validação necessária para cada caso. Não é obrigatório usar o ID como um número inteiro não. :coolio: Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 Não passa para a function quando é alfanumérico .. nem sequer aparece no "echo", mas se envio um ID inteiro, aparece normalmente.. poxa vida huahuahuha function listar_produto_por_id($id) { echo filter_var($id, FILTER_SANITIZE_STRING); exit(); ... } Não passa para a function quando é alfanumérico .. nem sequer aparece no "echo", mas se envio um ID inteiro, aparece normalmente.. poxa vida huahuahuha function listar_produto_por_id($id) { echo filter_var($id, FILTER_SANITIZE_STRING); exit(); ... } Será que não é por causa do meu .htaccess? RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?pg=$1 Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 26, 2014 Como está no arquivo que recebe o ID? No switch...? Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 <?php require 'produtos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'GET': echo $id; //chama função para visualizar o usuário if ($id <> '' or $id <> '') { echo listar_produto_por_id($id); } else { echo listar_todos_produtos(); } break; default: echo json_encode( 'Metodo HTTP nao permitido.' ); break; } Está assim.. o echo $id é apenas um teste. Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 26, 2014 Só tem isso? Cadê a variável que recupera e guarda o valor vindo do GET? Acho que deveria ser algo assim: case 'GET': $id = preg_replace("/[^0-9a-z]/i", "", $_GET['id']); //chama função para visualizar o usuário if ($id <> '' or $id <> '') { echo listar_produto_por_id($id); Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 Com as expressões regulares não funciona nem a ID como inteiro. Está passando zerado quando é "alfa" <?php require 'produtos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'GET': $id = filter_var($id, FILTER_SANITIZE_STRING); //chama função para visualizar o usuário if ($id <> '' or $id <> '0') { echo listar_produto_por_id($id); } else { echo listar_todos_produtos(); } break; default: echo json_encode( 'Metodo HTTP nao permitido.' ); break; } function listar_produto_por_id($id) { require_once('mysqli.php'); $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where and cd_produto='".$id."'"; $query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR); if ( mysqli_num_rows( $query ) > 0 ) { $retorno = array(); while( $resultado = mysqli_fetch_array( $query ) ) { $retorno[] = array( 'cd_produto' => $resultado['cd_produto'], 'nm_produto' => htmlentities($resultado['nm_produto']) ); } echo json_encode( array( 'content' => $retorno ) ); } else { echo json_encode( array( 'msg' => 'Nenhum produto disponível.' ) ); } } Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 27, 2014 lembrando que o filter_var faria mais sentido dentro da função. Como está usando fora dela, experimente trocar: $id = filter_var($id, FILTER_SANITIZE_STRING); Por: $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); Se não funcionar, logo após case 'GET': Coloque isto e retorne com o resultado: var_dump($_GET); exit; Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 27, 2014 Usando a requisição dessa forma: http://127.0.0.1/servidor/produtos/F000600188 <?php require 'produtos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'GET': $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); var_dump($_GET); exit; //chama função para visualizar o usuário if ($id <> '' or $id <> '0') { echo listar_produto_por_id($id); } else { echo listar_todos_produtos(); } break; default: echo json_encode( 'Metodo HTTP nao permitido.' ); break; } Retorna no dump: array(1) { ["pg"]=> string(19) "produtos/F000600188" } Retirando o exit, passa vazio para produtos_acoes.php, tanto com ID inteiro, quanto alfa. .tá complicado rsrs Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Março 27, 2014 Foco: var_dump($_GET); Retorna no dump: [inline]array(1) { ["pg"]=> string(19) "produtos/F000600188" }[/inline] Será que não é por causa do meu .htaccess? RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?pg=$1 Bingo! index.php?pg=$1 Vamos tentar com [inline]index.php?id=$1[/inline] ???Provavelmente vai quebrar alguma outra coisa que já esteja funcionando, mas resolve este problema... Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 27, 2014 Simplesmente parou de funcionar minha URL amigável huahuahuha Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 27, 2014 Você pode resolver (ou gambiarrar) de três maneiras, ao meu ver. 1) Usando querystrings Mude seu .htaccess para o seguinte: RewriteRule ^(.*)$ index.php?pg=$1 [QSA] Perceba a sigla [QSA]. Isso vai garantir que a reescrita do htaccess addicione as querystrings da URL. Aí você pode fazer a chamada assim: /produtos?id=1 Usando um var_dump($_GET), seu retorno seria mais ou menos isso: array(2) { ["pg"]=> string(8) "usuarios" ["id"]=> string(10) "F000600188" } Poderá até mesmo usar vários parâmetros em outros casos...Por exemplo: /usuarios?id=1&cidade=SP 2) Usando uma combinação de list() e explode(). Mantenha seu .htaccess da maneira que está, e, no arquivo que recebe o método HTTP (produtos.php), use um código mais ou menos assim: list( $page, $id ) = explode( '/', $_GET['pg'] ); $page = filter_var( $page, FILTER_SANITIZE_STRING ); $id = filter_var( $id, FILTER_SANITIZE_STRING ); E aí estarão a página requisitada e o ID desejado... 3) Fazer um mapeamento de rotas/reescrita manual no .htaccess. Exemplo: RewriteEngine On RewriteRule ^produtos/?$ produtos.php RewriteRule ^produtos/(.*)/?$ produtos.php?id=$1 É manual, mais fica mais fácil de adicionar e editar as rotas existentes... Aí você pode adicionar quantas rotas quiser, e personalizar de acordo com cada caso, fica flexível...Pois cada serviço do teu webservice pode ter uma estrutura de URLs diferentes... Sinceramente, são as formas que pensei para resolver isto. Não sei se são gambiarras, más práticas ou afins, mas podem resolver teu problema. Desculpe a imperícia no assunto :blush: Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 27, 2014 Que isso Jonaslhp, você está ajudando muito :yes: . Vou fazer uns testes e aviso. Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 27, 2014 Opa.. deu certo da seguinte forma: .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?pg=$1 produtos.php <?php require 'produtos_acoes.php'; switch( $_SERVER['REQUEST_METHOD'] ) { case 'GET': list( $page, $id ) = explode( '/', $_GET['pg'] ); $page = filter_var( $page, FILTER_SANITIZE_STRING ); $id = filter_var( $id, FILTER_SANITIZE_STRING ); //chama função para visualizar o usuário if ($id <> '') { echo listar_produto_por_id($id); } else { echo listar_todos_produtos(); } break; default: echo json_encode( 'Metodo HTTP nao permitido.' ); break; } produtos_acoes.php function listar_produto_por_id($id) { require_once('mysqli.php'); $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'"; $query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR); if ( mysqli_num_rows( $query ) > 0 ) { $retorno = array(); while( $resultado = mysqli_fetch_array( $query ) ) { $retorno[] = array( 'cd_produto' => $resultado['cd_produto'], 'nm_produto' => htmlentities($resultado['nm_produto']) ); } echo json_encode( array( 'content' => $retorno ) ); } else { echo json_encode( array( 'msg' => 'Nenhum produto disponível.' ) ); } } Valeu Jonaslhp o> Compartilhar este post Link para o post Compartilhar em outros sites
laisa.gomes 0 Denunciar post Postado Julho 25, 2017 Pessoal estou com o mesmo problema que a DannyND teve, alguem pode ajudar????? Compartilhar este post Link para o post Compartilhar em outros sites