Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

função alteraProduto(Php)

Boa tarde, não consigo localizar o erro que aparece em meu arquivo banco-produto, na função alteraProduto. Seria possível darem uma revisada e verificarem como posso resolver esse erro:

esse é o erro com o teste de envio das informações para o banco-produto:

* inicio alteração * array(8) { ["id"]=> string(1) "6" ["codigo"]=> string(2) "98" ["nome"]=> string(17) "Camisa Salamandra" ["preco"]=> string(6) "110.00" ["descricao"]=> string(10) "salamandra" ["cor_id"]=> string(1) "1" ["tamanho_id"]=> string(1) "1" ["categoria_id"]=> string(1) "1" } * inicio funcao alteraProduto *

O produto Camisa Salamandra não foi alterado: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' tamanho_id= , categoria_id= where id = 6' at line 3

arquivo banco-produto na função alteraProduto onde o erro aparece:

function alteraProduto($conexao, $produto) {
    echo ("* inicio funcao alteraProduto * "); //Aviso de teste
$query = "update produtos set  nome = '{$produto->getNome()}', codigo = '{$produto->getCodigo()}',
preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}',
cor_id= {$produto->getCor()->getId()}, tamanho_id= {$produto->getTamanho()->getId()},
categoria_id= {$produto->getCategoria()->getId()} where id = {$produto->getId()}";
return mysqli_query($conexao, $query);

//Codigo novo - apenas para teste
    if ($retorno ==""){
        echo ("* retornou ... * "); //Aviso de teste
        $retorno = 0;
    }

    echo ("* fim pesquisa * "); //Aviso de teste
    return $retorno;

}

arquivo altera-produto onde envio os dados para alteração

<?php
require_once 'conecta.php';
require_once 'banco-produto.php';
require_once 'banco-cor.php';
require_once 'banco-tamanho.php';
require_once 'banco-categoria.php';
require_once 'produto.php';
require_once 'cor.php';
require_once 'tamanho.php';
require_once 'categoria.php';


$produto = new Produto();
echo ("* inicio alteração * "); //Aviso de teste
$produto->setId( $_POST['id'] );
$produto->setCodigo( $_POST["codigo"]) ;
$produto->setNome( $_POST["nome"]);
$produto->setPreco( $_POST["preco"]);
$produto->setDescricao( $_POST["descricao"]);
$produto->setCor(new Cor());
$produto->getCor( $_POST["cor_id"]);
$produto->setTamanho(new Tamanho());
$produto->getTamanho( $_POST["tamanho_id"]);
$produto->setCategoria(new Categoria());
$produto->getCategoria( $_POST["categoria_id"]);

var_dump($_POST);


if(alteraProduto($conexao, $produto)) { ?>
<!--<script type="text/javascript">
    setTimeout(function(){window.location="produto-formulario.php"} , 30000);
    </script>-->
<p class="text-success">
O produto <?=$produto->getNome() ?> foi alterado.
</p>
<noscript> 
Se não for direcionado automaticamente, clique <a href="produto-lista.php">aqui</a>. 
</noscript>
<?php
} else {
$msg = mysqli_error($conexao);
?>
<p class="text-danger">O produto <?=$produto->getNome() ?>
 não foi alterado: <?= $msg?></p>
<?php
}
?>
<!--
<script language="JavaScript"> 
window.location="produto-lista.php"; 
</script>

tabela produtos no BD

Table: produtos
Columns:
id int(11) AI PK 
codigo varchar(50) 
nome varchar(150) 
preco decimal(10,2) 
descricao varchar(150) 
cor_id tinyint(4) 
tamanho_id tinyint(4) 
categoria_id tinyint(4)
8 respostas

Oi Sergio, tudo bom?

Parece que você ta com um probleminha de sintaxe na sua query:

"update produtos set  nome = '{$produto->getNome()}', codigo = '{$produto->getCodigo()}',
preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}',
cor_id= {$produto->getCor()->getId()}, tamanho_id= {$produto->getTamanho()->getId()},
categoria_id= {$produto->getCategoria()->getId()} where id = {$produto->getId()}";

Acredito que esteja faltando algumas aspas simples para categoria_id e tamanho_id:

"update produtos set  nome = '{$produto->getNome()}', codigo = '{$produto->getCodigo()}',
preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}',
cor_id= {$produto->getCor()->getId()}, tamanho_id= '{$produto->getTamanho()->getId()}',
categoria_id= '{$produto->getCategoria()->getId()}' where id ={$produto->getId()}";

Isso acontece porque, como não estamos passando nenhum valor para esses campos, a query resultante fica com esse campo vazio e sem aspas alguma, da erro de sintaxe.

Se a ideia é não atualizar esses dados, é só tirar esses campos do seu update =)

Abraço e bons estudos!

Muito obrigado pelo seu retorno André, estou querendo passar sim dados para alteração e fiz as alterações que me sugeriu mas não funcionou.

O sistema que estou tentando fazer funciona assim: 1) usuario digita codigo do produto a pesquisar, se existe ele retorna para alteração caso não ele inclui um novo produto exatamente igual ao curso FP-73.

2) Quando ele retorna os dados que existem no BD para pagina de alteração nos campos cor, tamanho e categoria ele não está vindo os dados. (esqueci de mencionar isso), estes tres campos, Os demais ok.

Então eu tenho dois problemas não estão vindo esses campos (cor, tamanho e categoria) juntamente com o ID passado bem como não estou conseguindo fazer alterações. Segue o erro que ocorreu mesmo acrescentando as haspas simples:

* inicio alteração * array(8) { ["id"]=> string(1) "9" ["codigo"]=> string(2) "99" ["nome"]=> string(13) "Blazer Basico" ["preco"]=> string(6) "399.00" ["descricao"]=> string(17) "Blazer um jackard" ["cor_id"]=> string(1) "1" ["tamanho_id"]=> string(1) "1" ["categoria_id"]=> string(1) "1" } * inicio funcao alteraProduto *
O produto Blazer Basico não foi alterado: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' tamanho_id= '', categoria_id= '' where id =9' at line 3

Entendo. Você pode compartilhar com a gente aqui um desc da sua tabela produtos? Algo como:

desc produtos;

Aguardo retorno!

Oi André muito obrigado, segue:

Field    Type    Null    Key    Default    Extra
id        int(11)    NO    PRI    NULL    auto_increment
codigo    varchar(50)    YES        NULL    
nome    varchar(150)    YES        NULL    
preco    decimal(10,2)    YES        NULL    
descricao    varchar(150)    YES        NULL    
cor_id    tinyint(4)    YES        NULL    
tamanho_id    tinyint(4)    YES        NULL    
categoria_id    tinyint(4)    YES        NULL

Oi Sergio, embora falte alguns relacionamentos estrangeiros na sua tabela, acredito que o problema não esteja ai pois os campos estão reservados.

Dando uma olhada melhor no seu código, fiquei com algumas duvidas quanto a forma com que você está populando seus atributos:

$produto->setId( $_POST['id'] );
$produto->setCodigo( $_POST["codigo"]) ;
$produto->setNome( $_POST["nome"]);
$produto->setPreco( $_POST["preco"]);
$produto->setDescricao( $_POST["descricao"]);
$produto->setCor(new Cor());
$produto->getCor( $_POST["cor_id"]);
$produto->setTamanho(new Tamanho());
$produto->getTamanho( $_POST["tamanho_id"]);
$produto->setCategoria(new Categoria());
$produto->getCategoria( $_POST["categoria_id"]);

Normalmente não passamos parametros em metodos get.

Posso dar uma olhada na sua entidade Produto?

Claro que sim André segue:

<?php
class Produto
{
private $id;
private $codigo;
private $nome;
private $preco;
private $descricao;
private $categoria;
private $cor;
private $tamanho;


function __construct()
{

}

public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}

public function getCodigo()
{
return $this->codigo;
}
public function setCodigo($codigo)
{
$this->codigo = $codigo;
}


public function getNome()
{
return $this->nome;
}
public function setNome($nome)
{
$this->nome = $nome;
}

public function getPreco()
{
return $this->preco;
}
public function setPreco($preco){
  if(!is_numeric($preco)){
    $preco_convertido = str_replace("R$ ", "", $preco);
    $preco_convertido = str_replace(".", "", $preco_convertido);
    $preco_convertido = (float) str_replace(",", ".", $preco_convertido);
    $this->preco = $preco_convertido;
  }else {
    $this->preco = $preco;
  }
}

public function getDescricao()
{
return $this->descricao;
}
public function setDescricao($descricao)
{
$this->descricao = $descricao;
}

public function getCategoria()
{
return $this->categoria;
}
public function setCategoria($categoria)
{
$this->categoria = $categoria;
}

public function getCor()
{
return $this->cor;
}
public function setCor($cor)
{
$this->cor = $cor;
}


public function getTamanho()
{
return $this->tamanho;
}
public function setTamanho($tamanho)
{
$this->tamanho = $tamanho;
}



}
solução!

Realmente, seus gets n recebem nada. Certinho =)

Acredito que o que você queria fazer era definir um id pros seus objetos certo? Algo como:

$produto->setId( $_POST['id'] );
$produto->setCodigo( $_POST["codigo"]) ;
$produto->setNome( $_POST["nome"]);
$produto->setPreco( $_POST["preco"]);
$produto->setDescricao( $_POST["descricao"]);
    $cor = new Cor(); 
    $cor->setId( $_POST["cor_id"]);
$produto->setCor($cor);
    $tamanho = new Tamanho();
    $tamanho->setId( $_POST["tamanho_id"]);
$produto->setTamanho($tamanho);
    $categoria = new Categoria();
    $categoria->setId( $_POST["categoria_id"]);
$produto->setCategoria($categoria);

Dessa forma separamos a instancia dos seus objetos em uma variavel pra poder definir o id dela.

Se estiver tudo certo, acredito que agora vai rolar. Porque agora você realmente tem uma instancia de Tamanho/Cor/Descrição no seu produto com um id para ser buscado =)

Qualquer problema, compartilha com a gente!

Abraço e bons estudos.

Perfeito André muito obrigado!!!!!!!!!! Foi isso mesmo

Matou na mosca! Funciona que é uma beleza.

valeu

abraços