Ir para conteúdo
gersonab

[Resolvido] update combobox php mysql

Recommended Posts

bom dia a todos.
tenho um combobox com dados vindo do BD, funciona perfeitamente, porém não consigo fazer com que no update o mesmo não apareça selecionado e tb este não funciona.

cadastro funcionando ( janela modal )

<div class="row">
  <div class="col-md-12">
    <label for="inputAddress">Categoria</label>
    <select class="form-control" name="tip" id="idm">
      <option value="">-- Selecionar --</option>
      <?php
$query55 = $pdo->query("SELECT idm, material FROM mat ORDER BY material ASC");
$registros = $query55->fetchAll(PDO::FETCH_ASSOC);

foreach($registros as $option) {
?>
      <option value="<?php echo $option['idm']?>"><?php echo $option['material']?></option>
      <?php
}
?>
    </select>
  </div>
  <div class="col-md-12">
    <label for="inputAddress">Material</label>
    <select class="form-control" name="idma" id="idma">
      <option value="">-- Selecionar --</option>

    </select>
  </div>
</div>

a função do cadastro funcionando

let selectCategoria = document.getElementById('idm');

let montaSelect = function () {
    let selectSubcategoria = document.getElementById('idma');
    let valor = selectCategoria.value;
    let selected = selectSubcategoria.dataset.tip;

    fetch("select_subcategoria.php?idm=" + valor + "&selected=" + selected)
        .then(response => {
            return response.text();
        })
        .then(texto => {
            selectSubcategoria.innerHTML = texto;
        });
}

selectCategoria.onchange = () => {
    montaSelect();    
}

montaSelect();

o select do cadastro funcionando
 

$tip = $_GET['idm'];
$selected = isset($_GET['selected']) ? $_GET['selected'] : null;

$query = $pdo->prepare("SELECT *
    FROM tipomat
    WHERE tip=:tip
    ORDER BY tipom ASC");

$datax = ['tip' => $tip];
$query->execute($datax);

$registros = $query->fetchAll(PDO::FETCH_ASSOC);

echo '<option value="">Selecione um material</option>';

foreach($registros as $option) {
    $check = '';
    if($selected == $option['idma']) {
        $check = 'selected';
    }
?>
    <option value="<?php echo $option['idma']?>" <?php echo $check; ?>><?php echo $option['tipom']?></option>
<?php
}

como podemos observar estes estão enviando os dados através do id , logo esta sendo usado getElementById , ja passei tudo para class e getElementsByClassName , porém não funciona o update, já modifiquei os ids idm para idm2 e idma para idma2 , modifiquei a função e o select conforme estes , porém não aparece os combos selecionados e não deixa selecionar a subcategoria.

 

<div class="row">
  <div class="col-md-12">
    <label for="inputAddress">Categoria</label>
    <select class="form-control" name="idm" id="idm2">
      <option value="">-- Selecionar --</option>
      <?php
$query55 = $pdo->query("SELECT idm, material FROM mat ORDER BY material ASC");
$registros = $query55->fetchAll(PDO::FETCH_ASSOC);
$check = '';
if($idm == $option['idm']) {
$check = 'selected';
}
foreach($registros as $option) {
?>
      <option value="<?php echo $option['idm']?>"  <?php echo $check; ?>><?php echo $option['material']?></option>
    <?php
}
?>
    </select>
</div>
<div class="col-md-12">
  <label for="inputAddress">Material</label>
  <select class="form-control" name="idma" id="idma2" data-subcategoria_id="<?php echo $idma?>" required>
    <option value="">-- Selecionar --</option>

  </select>
</div>

</div>

função 2

let selectCategoria2 = document.getElementById('idm2');

let montaSelect2 = function () {
    let selectSubcategoria2 = document.getElementById('idma2');
    let valor2 = selectCategoria2.value;
    let selected2 = selectSubcategoria2.dataset.tip;

    fetch("select_subcategoria2.php?idm2=" + valor2 + "&selected=" + selected2)
        .then(response => {
            return response.text();
        })
        .then(texto => {
            selectSubcategoria2.innerHTML = texto;
        });
}

selectCategoria2.onchange = () => {
    montaSelect2();    
}

montaSelect2();

 

select

$tip = $_GET['idm2'];
$selected = isset($_GET['selected']) ? $_GET['selected'] : null;

$query = $pdo->prepare("SELECT *
    FROM tipomat
    WHERE tip=:tip
    ORDER BY tipom ASC");

$datax = ['tip' => $tip];
$query->execute($datax);

$registros = $query->fetchAll(PDO::FETCH_ASSOC);

echo '<option value="">Selecione um material</option>';

foreach($registros as $option) {
    $check = '';
    if($selected == $option['idma']) {
        $check = 'selected';
    }
?>
    <option value="<?php echo $option['idma']?>" <?php echo $check; ?>><?php echo $option['tipom']?></option>
<?php
}

só lembrando q são janelas modais e estão na mesma página, não aparece erro no console.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu não sei absolutamente nada de modal, eu faria assim:

 

<?php
// mysql tipomat (id,tipo) (1,Básico)(2,Eventual)
// mysql mat (id,idtipo,material,valor) (1,1,Caneta,2.00)(2,1,Lapis,1.00)
//                                      (3,1,Borracha,0.50)
//                                      (4,2,Baton,5.00)(5,2,Preservativo,2.00)
$pdo=new PDO("mysql:host=localhost;dbname=laravel","root",""); ?>
<div style="width:500px;margin:0 auto">
<form>
<select name=tip id=tip onchange=submit()>
<option value="">Selecionar Categoria</option>
	<?php	
	$query=$pdo->query("SELECT id, tipo FROM tipomat");
	$registros = json_decode(json_encode($query->fetchAll(PDO::FETCH_ASSOC)));
	foreach($registros as $option) {
		echo "<option value='$option->id'>$option->tipo</option>";} ?>
</select>
</form>
<?php
if(isset($_GET['tip'])){ 
$tipo=$_GET['tip']; ?>
<script>tip.value=<?=$tipo?></script>
<select name=mat onchange=alert(value)>
<option value="">Selecionar Material</option>
	<?php	
	$query=$pdo->query("SELECT * FROM mat where idtipo=$tipo");
	$registros = json_decode(json_encode($query->fetchAll(PDO::FETCH_ASSOC)));
	foreach($registros as $option) {
		echo "<option value='$option->valor'>$option->material</option>";} ?>
</select>
<?php }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Frank, obrigado pela ajuda, porém eu preciso dos dados na modal, estou conseguindo passar os dados completos , porém não estou conseguindo fz com que os selects acertem , preciso pegar dois dados e colocar no select pois estão vindo com todas selecionados.

<select class="form-control" name="idm" id="idm2">
  <option value="">-- Selecionar --</option>
  <option value="3"  selected>2.2X</option>
  <option value="2"  selected>2.5X</option>
  <option value="1"  selected>2.8X</option>
  <option value="4"  selected>FERRAGENS</option>
</select>

está dessa forma no console e :

<select class="form-control" name="idma" id="idma2" data-subcategoria_id="" required>
<option value="">-- Selecionar --</option>
let selectCategoria2 = document.getElementById('idm2');

let montaSelect2 = function () {
    let selectSubcategoria2 = document.getElementById('idma2');
    let valor2 = selectCategoria2.value;
    let selected2 = selectSubcategoria2.dataset.idma2;

    fetch("select_subcategoria2.php?idm2=" + valor2 + "&selected2=" + selected2)
        .then(response => {
            return response.text();
        })
        .then(texto => {
            selectSubcategoria2.innerHTML = texto;
        });
}

selectCategoria2.onchange = () => {
    montaSelect2();    
}

montaSelect2();
$tip = $_GET['idm2'];
$selected = isset($_GET['selected2']) ? $_GET['selected2'] : null;

$query = $pdo->prepare("SELECT *
    FROM tipomat
    WHERE tip=:tip
    ORDER BY tipom ASC");

$datax = ['tip' => $tip];
$query->execute($datax);

$registros = $query->fetchAll(PDO::FETCH_ASSOC);

echo '<option value="">Selecione um material</option>';

foreach($registros as $option) {
    $check = '';
    if($selected == $option['tip']) {
        $check = 'selected';
    }
?>
    <option value="<?php echo $option['idma']?>" <?php echo $check; ?>><?php echo $option['tipom']?></option>
<?php
}
?>

pego os dados assim no menu

$(".idorc").change(function(event){
		var idorc = event.currentTarget.value;
		$.ajax({ 
		url: '../lista/selorc3.php', 
		type: 'GET', 
		data:{"idorc" : idorc}, 
		success: function(data) { 
		console.log(data); 
		$(".atualizamenu2").html(data)
		}
		}); 
		});
		
		$('#acaomodal').on('show.bs.modal', function (event) {
		var button = $(event.relatedTarget)
		var recipient = button.data('whatever')
		var recipientct = button.data('whateverct')
		var recipientqt = button.data('whateverqt')
		var recipientidm = button.data('whateveridm')
		var recipientidma = button.data('whateveridma')
		var recipientlar = button.data('whateverlar')
		var recipientalt = button.data('whateveralt')
		var recipientorc = button.data('whateverorc')
		var modal = $(this)
		modal.find('#idorc').val(recipient)
		modal.find('#idcatc').val(recipientct)
		modal.find('#qtde').val(recipientqt)
		modal.find('#idm2').val(recipientidm)
		modal.find('#idma2').val(recipientidma)
		modal.find('#largor').val(recipientlar)
		modal.find('#altuor').val(recipientalt)
		modal.find('#orc').val(recipientorc)
		});

quando seleciono o radio button:

<a class="btn btn-outline-primary" href="" data-toggle="modal" data-target="#acaomodal" data-whatever="150" data-whateverct="14" data-whateverqt="2" data-whateveridm="3" data-whateveridma="72" data-whateverlar="2.000" data-whateveralt="2.000" data-whateverorc="0000000003"> Editar item </a>

a dificuldade esta sendo em passar no início do formulário o idm2 e idma2 definidos

Compartilhar este post


Link para o post
Compartilhar em outros sites

pag2.php 

<?php
$categoria=$_GET['categoria'];
if($categoria=="Básica"){
    ?>
    <select>
        <option>Selecione uma opção</option>
        <option>Caneta</option>
        <option>Lápis</option>
        <option>Borracha</option>
    </select>
    <?php
}
if($categoria=="Eventual"){
    ?>
    <select>
        <option>Selecione uma opção</option>
        <option>Baton</option>
        <option>Preservativo</option>
    </select>
    <?php
}

 

teste.php

<script>
function java(escolhido){
    fetch("pag2.php?categoria="+escolhido)
    .then(response => {return response.text()})
    .then(texto => {mensagem.innerHTML = texto})}
</script>
<select id=categoria onchange=java(value)>
    <option>Selecione uma opção</option>
    <option>Básica</option>
    <option>Eventual</option>
</select>
<div id=mensagem style="margin-top:100px"></div>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria mais "econômico", ao invés de trafegar todo esse html, entregar apenas um json?
E no front, a cada changeEvent, montar o outro select conforme necessário, via js? 

Econômico, inteligente e reusável, pq com os dados em json, você pode alimentar o que quiser, e não somente um select.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Bom dia, Wash,

O meu conhecimento em json é bastante precário. Eu tentei montar um json assim:


<?php
$mysqli=new mysqli("localhost","root","","laravel");
$query=$mysqli->query("select * from mat join tipomat on tipomat.id = mat.idtipo");
$json=json_encode($query->fetch_all(MYSQLI_ASSOC));
$file=fopen("json.json","w");
fwrite($file,$json);

e tentei pegar o json na outra página assim:
 

<div id=mensagem style="margin-top:100px"></div>
<script>
    fetch("json.json")
    .then(response => {return response.json()})
    .then(texto => {mensagem.innerHTML = texto})
</script>

E no navegador eu obtive isso:
[object Object],[object Object],[object Object],[object Object],[object Object]

 

Ou seja, eu acho que eu consegui pegar o json lá do arquivo json.json que foi criado pelo json.php. O problema é que eu não sei como colocar o json numa variável do javascript, e não no meio da página do HTML. 

Note que o código é bem errado. Ele pega os dados de um arquivo que já foi montado. Agora para o JavaScript pedir para o PHP montar o arquivo json, e depois o JavaScript pegar o resultado, eu acho bem difícil de codificar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa gerar um arquivo .json
Apenas devolver o array com o resuldado do database, em formato json.

 

<?php
// treat this as json
header('Content-Type: application/json');
// handle the request
if (!isset($_GET['category']) || !preg_match('/^[A-Z]$/', $_GET['category'])) {
  // clear the old headers
  header_remove();
  // set the actual http response code
  http_response_code(404); // ok, validation error, or failure
  header('Status: 404 Not Found');
  exit();
}
// consider this is a database
$database = [
  'A' => [
    [
      'id' => 'A-123',
      'name' => 'Produtc 01 from Category A'
    ],
    [
      'id' => 'A-234',
      'name' => 'Produtc 02 from Category A'
    ],
    [
      'id' => 'A-345',
      'name' => 'Produtc 03 from Category A'
    ],
    [
      'id' => 'A-456',
      'name' => 'Produtc 04 from Category A'
    ]
  ],
  'B' => [
    [
      'id' => 'B-123',
      'name' => 'Produtc 01 from Category B'
    ],
    [
      'id' => 'B-234',
      'name' => 'Produtc 02 from Category B'
    ],
    [
      'id' => 'B-345',
      'name' => 'Produtc 03 from Category B'
    ],
  ],
  'C' => [
    [
      'id' => 'C-123',
      'name' => 'Produtc 01 from Category C'
    ],
    [
      'id' => 'C-234',
      'name' => 'Produtc 02 from Category C'
    ],
  ],
  'D' => [],
];

die(json_encode($database[$_GET['category']]));


veja o exemplo em:
https://github.com/w-studies/ajax-json

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma vez obrigado, Wash!

Finalmente aprendi a mandar um json do PHP para o JavaScript, olha só:

index.php

<script>
async function json(){
    response = await fetch("teste.php")
    produtos = await response.json()
    categorias = {}
    produtos.forEach(function(produto){
        key=produto.tipo
        if(!categorias[key]){categorias[key]=[]}
        categorias[key].push(produto.tipo)})
}
json()
</script>


--------------------------------------------------------------------------

teste.php

<?php
$mysqli=new mysqli("localhost","root","","laravel");
$query=$mysqli->query("select * from mat join tipomat on tipomat.id = mat.idtipo");
die(json_encode($query->fetch_all(MYSQLI_ASSOC)));

Agora que eu consegui chegar no JavaScript, eu também aprendi que não é possível usar a variável global com função assíncrona e nem a notação {{variavel}} no HTML. Outro grande problema é que eu não sei usar o Ajax, ou seja, eu estou bem longe do mundo do front-end e back-end, ou seja, a economicidade ainda não é a minha praia. Mesmo assim, eu estou bastante grato, durante três anos eu acreditava que era impossível o PHP mandar o json para o cliente. Valeu mesmo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estudei o tutorial do Wash, mas lá tem muita coisa que está fora da minha compreensão.

 

Eu fiz um código meia boca que contempla o uso do json do PHP, mas sem Ajax e sem Boostrap.

index.html

<script>
    async function json(){
        response=await fetch("dados.php?tarefa=categoria");
        dados=await response.json();
        first.innerHTML="<option>Selecione uma Categoria</option>"
        dados.forEach(function(dado){
            first.innerHTML+="<option>"+dado.tipo+"</option>"})}
    async function json2(){
        modal2.style='display:block;margin-top:50px'
        response=await fetch("dados.php?tarefa="+first.value);
        dados=await response.json();
        second.innerHTML="<option>Selecione um Produto</option>"
        dados.forEach(function(dado){
            second.innerHTML+="<option>"+dado.material+"</option>"})}
</script>

<button onclick="modal.style='display:block;margin-top:50px'">
Abrir modal
</button>

<div id=modal style='display:none'>
<select id=first onchange=json2()>
<script>json()</script>
</select>
</div>

<div id=modal2 style='display:none'>
<select id=second>
</select>
</div>

=================================================

dados.php

<?php
// mysql mat(id,material,valor,idtipo)
// mysql tipomat (id,tipo)
$mysqli=new mysqli("localhost","root","","laravel");
$tarefa=$_GET['tarefa'];
if($tarefa=="categoria"){
    $query=$mysqli->query("select * from tipomat");}
if($tarefa!=="categoria"){
    $query=$mysqli->query(
    "select * from mat join tipomat on mat.idtipo=tipomat.id where tipo='$tarefa'");}
die(json_encode($query->fetch_all(MYSQLI_ASSOC)));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom dia, desde já agradeço toda ajuda,estudei ambos os códigos, porém vou esclarecer , meu problema esta no update, o combo funciona para cadastrar sem problema, o erro é que quando clico para fazer uma alteração ambos retornam vazios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gersonab Verifique sim o console mas use o navegador Mozilla-Firefox, verifique os elementos no seletor veja se eles possuem valor.

- Caso possua, o problema está na parte de recebimento de dados antes ou durante o UPDADE.

Antes da executar a query verifique os dados recebidos através da função var_dump 

Os dados estão corretos nessa parte então presumimos que algo está errado na execução da query, você poderá saber qual o problema usando PDOException para lançar o motivo do erro pela exceção.

 

- Caso os valores não estão presentes nas opções siga o procedimento anterior.

Sem nenhum problema nos termos citados nessa parte veremos então o javascript, ao qual desconsidero ser o problema pois ele não monta o seletor.

 

Se acha conveniente poste a estrutura das duas tabelas (não precisa dos registros) que irei fazer um exemplo prático para você analisar e compila-lo nas suas necessidades.

 

O conceito apresentado pelo @washalbano é sem dúvida muito bom, assim se possui um arquivo que sempre estará de pronta entrega dos dados então é só montar o HTML com base no resultado. E necessariamente não é preciso trabalhar com JSON, porém é melhor pois quando se trata de arrays multidimensional é mais prático usar json no javascript.

Mas considere que aplicar restrições/condições de leitura, hora que se usamos 2 ou mais tabelas; não precisaremos de ler outras tabelas quando apenas precisamos de uma só.

 

Citar

O que é um modal?

Modal é um modelo usado para um bloco que surge em frente aos elementos visíveis do html na tela.


<p>Se remover ou alterar o display do elemento abaixo ele me cobre, e isso é o que chama-se de modal</p>
<div style="display:none; background:white; position: fixed; bottom: 10px; left: 10px;">
  Eu sou um modal
</div>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom , vamos lá, consigo popular o primeiro select porem o segundo ainda vem em vazio. deveria vir com o material a ser editado.

<?php
$dados = $_GET['idorc'];
$consmenuor1 = $pdo->query("SELECT * FROM orcamencli WHERE idorc ='".$dados."' ");
$userou1 = $consmenuor1->fetch(PDO::FETCH_ASSOC);
............
?>
<div class="modal fade" id="acaomodal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"  aria-hidden="true">
  <div class="modal-dialog" role="document" style="max-width:500px">
    <form method="POST" action="../lista/edtiorca.php">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Editar material</h5>
        </div>
        <div class="modal-body">
          <div class="row">
            <?php
echo $idorc." - ".$idm2." - ".$idma2;
?>
            <div class="col-md-12">
              <label for="inputAddress">Categoria</label>
              <select class="form-control" name="idm" id="idm2">
                <option value=""> </option>
                <?php


$query55 = $pdo->query("SELECT idm, material FROM mat ORDER BY material ASC");
$registros = $query55->fetchAll(PDO::FETCH_ASSOC);
foreach($registros as $option) {
$check = '';
if($idm2 == $option['idm']) {
$check = 'selected';
}

?>
                <option value="<?php echo $option['idm']?>"  <?php echo $check; ?>><?php echo $option['material']?></option>
              <?php
}
?>
              </select>
          </div>

          <div class="col-md-12">
            <label for="inputAddress">Material</label>
            <select class="form-control" name="idma" id="idma2" data-subcategoria_id="<?php echo $idma2;?>" required>
              <option value="">-- Selecionar --</option>

            </select>
          </div>

        </div>
        <br>
        <div class="modal-footer">
          <button class="btn" data-dismiss="modal">Cancelar</button>
          <button type="submit" class="btn btn-primary">Concluir</button>
        </div>
      </div>
      </div>
    </form>
</div>
</div>  
<script>
  var selectCategoria2 = document.getElementById('idm2');

  var montaSelect2 = function () {
    var selectSubcategoria2 = document.getElementById('idma2');
    var valor2 = selectCategoria2.value;
    var selected2 = selectSubcategoria2.dataset.idma2;

    fetch("select_subcategoria2.php?idm2=" + valor2 + "&selected2=" + selected2)
      .then(response => {
      return response.text();
    })
      .then(texto => {
      selectSubcategoria2.innerHTML = texto;
    });
  }

  selectCategoria2.onchange = () => {
    montaSelect2();    
  }

  montaSelect2();
</script>
<?php
$tip = $_GET['idm2'];
$selected2 = isset($_GET['selected2']) ? $_GET['selected2'] : null;

$query = $pdo->prepare("SELECT * FROM tipomat WHERE tip=:tip ORDER BY tipom ASC");
$datax = ['tip' => $tip];
$query->execute($datax);

$registros = $query->fetchAll(PDO::FETCH_ASSOC);

echo '<option value="">Selecione um material</option>';

foreach($registros as $option) {
    $check = '';
    if($selected2 == $option['idma']) {
        $check = 'selected';
    }
?>
    <option value="<?php echo $option['idma']?>" <?php echo $check; ?>><?php echo $option['tipom']?></option>
<?php
}
?>

acredito ser algo simples q não estou vendo ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que você está tentando montar duas caixas de combinação ao mesmo tempo.

Primeiro, você tem que aguardar o usuário a selecionar a categoria, e só depois disso é que você pode montar a segunda caixa de combinação.

Ou seja, o script para montar a caixa de combinação do material tem que ser função da primeira caixa de combinação, não dá para o HTML montar os dois ao mesmo tempo como você está tentando fazer.

 

Aqui está a minha sugestão, supondo que no MySQL temos duas tabelas

mat(id,material,valor,idtipo)

tipomat (id,tipo)

 

index.php

<div>
    <select name=idm id=idm2 onchange=montarMaterial(value)>
    <option>Selecione a Categoria</option>
    <option>Básico</option>
    <option>Eventual</option>
    </select>
</div>

<div style="margin-top:50px">
    <select name=idma id=idma2>
    </select>
</div>

<script>
  async function montarMaterial(categoria){
    response=await fetch('material.php?categoria='+categoria)
    materiais=await response.json();
    idma2.innerHTML="<option>Selecione o Material</option>"
    materiais.forEach(function(material){
            idma2.innerHTML+="<option>"+material.material+"</option>"})}
</script>

--------------------------------------------------------------------------------

material.php

<?php
$categoria=$_GET['categoria'];
$pdo=new PDO("mysql:host=localhost;dbname=laravel","root","");
$query=$pdo->query("select * from mat join tipomat on 
  tipomat.id=mat.idtipo where tipo='$categoria'");
die(json_encode($query->fetchAll(PDO::FETCH_ASSOC)));

Outro problema é o planejamento. Se você quer fazer um orçamento, para que trabalhar com categoria? Por exemplo: coloquei lápis na categoria básica e baton na categoria eventual. Se o cliente quiser os dois itens, como acrescentar os dois no orçamento? Nesse caso, a categoria só atrapalha.

Para ajudar melhor na próxima vez, coloque sempre a estrutura do banco de dados (as tabelas e alguns exemplos) e todo o codigo e não parte de um código daqui e outro dali, omitindo o código que você acha que deu certo (pois é justamente onde o código que você não publicou é que está 100% do problema).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Frank , desde já agradeço sua ajuda, pois despertou q estou fazendo errado, vou explicar melhor, sim é um orçamento, porém o mesmo material tem várias categorias , com valores diferentes, por isso as tabelas, para facilitar a escolha, vamos lá ....

a tabela mat é a tabela da categoria destes, onde informo o material utilizado:

CREATE TABLE `mat` (
  `idm` int(10) NOT NULL,
  `material` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `mat` (`idm`, `material`) VALUES
(1, 'tipo1'),
(2, 'tipo2'),
(3, 'tipo3'),
(4, 'tipo4');

a tabela tipomat é onde tenho a lista de itens, lembro que todos os itens são repetidos para todos os tipos de material e ou categoria como preferir, só mudando o valor conforme a categoria, separei as tabelas para facilitar a escolha do material pois de 30 iria aparecer na verdade 30 x 4 = 120 , separando fica mais facil, tipo estado x cidade como ja vimos ....

CREATE TABLE `tipomat` (
  `idma` int(10) NOT NULL,
  `tip` int(10) NOT NULL, /* aqui vem o idm da tabela mat */
  `tipom` varchar(200) NOT NULL,
  `valorm` decimal(10,2) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

aí eu tenho a tabela onde faço o orçamento, com todos os itens escolhidos, você pode perguntar o pq de tantas tabelas, mas é que mesmo com o orçamento pronto se o cliente resolver modificar o material , basta trocar que estes são atualizados.

CREATE TABLE `orcamencli` (
  `idorc` int(10) NOT NULL,
  `idocli` int(10) NOT NULL,
  `idmate` int(10) NOT NULL,/* aqui vem o idma da tabela tipomat*/
  `categ` int(10) NOT NULL, /* aqui vem o tip da tabela tipomat que é o mesmo idm da tabela mat*/
  `orc` int(10) NOT NULL,
  `idcatc` int(10) NOT NULL,
  `itemor` varchar(200) NOT NULL,
  `qtde` char(10) DEFAULT '1',
  `valoror` decimal(10,2) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

o q estou vendo agora é q eu estava buscando os valores na tabela errada para fazer o update, acredito eu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi.

Esta linha estava errada

var selected2 = selectSubcategoria2.dataset.idma2;

o correto

var selected2 = selectSubcategoria2.dataset.subcategoria_id;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendo porque a categoria tem que aparecer no orçamento. Vamos criar um exemplo palpável:

 

Você vende madeira, que tem 4 categorias

mat(idm,material)(1,duro fino)(2,duro grosso)(3,mole fino)(4,mole grosso)

A tabela de produtos tem pelo menos 4 códigos:

tipomat(idma,tip,tipom,valorm)(1,1,pau,1.00)(2,2,pau,2.00)(3,3,pau,0.50)(4,4,pau,0.75)

Finalmente nós temos o orçamento do Ricardão:

orcamencli(idmate,categ,itemor,valoror)(1,1,pau duro fino,1.00)

 

Se o Ricardão mudar de ideia, mudar de categoria vai ser um inferno, você vai ter que trocar o valor do idmate bem como do itemor e o valoror.

A minha intuição diz para jogar tudo fora, e ao invés de trabalhar com o motor ISAM trabalhar com o motor InnoDB, assim:

 

produtos(id,produto,valor)(1,pau duro fino,1.00)(2,pau duro grosso,2.00)(3,pau mole fino,0.50)(4,pau mole grosso,0.75)

orçamento(id,idCliente,total)(1,69,1.00)

historicoOrçamento(id,idOrçamento,idProduto,qt,Produto,Subtotal)(1,1,1,1,pau duro fino,1.00)

Note que eu dividi o orçaento em duas partes. No principal aparece o cliente. No histórico, só aparece o que ele comprou. No caso do Ricardão mudar de ideia, basta selecionar apenas o código do produto (a descrição e o cálculo do subtotal estarão vinculados). Assim você não corre o risco de alterar o código da categoria e esquecer de alterar o código do produto.

Antes de você pegar o PHP, o melhor é dominar o MySQL. O MySQL é muito chato, eu levei um tempão até entender o que é chave primária, o tal do id que aparece em todas as tabelas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a categoria é necessária pq o mesmo material pode ter 3 ou mais categorias e seu valor varia conforme a categoria um exemplo , o Ricardão comprou 20 itens da categoria 1 se ele resolver mudar de categoria eu tenho como alterar todos os itens e valores alterando somente a categoria, o resto é automático.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde! Seu problema não é com PHP, favor postar na área correta da próxima vez pra ajudar na organização do fórum...

 

Considere ler: Seu problema é realmente com PHP ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Conteúdo Similar

    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.