MySQL limita uso após atualização para Ubuntu 16.04

Iniciado por maurov, 02 de Janeiro de 2017, 15:33

tópico anterior - próximo tópico

zekkerj

Quando o campo não é preenchido, o form pode fornecer valores padrão. Aliás, a própria base pode fornecer valores padrão. P.ex., com campos de data, vc pode configurar a base para preenchê-los com a hora automaticamente.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

Não funciona a contento.
Então, resumindo:

Num campo tipo checkbox:
<input type="checkbox" name="quitacao" id="quitacao"
value="<?php echo $quitacao; ?>" <?php if ($quitacao=='1') { echo ' checked '; } ?> />

No PHP:
$query = "INSERT INTO mytable (quitacao, dataquit) VALUES ('$quitacao','$dataquit')";

No DB
Name: quitacao
Type: tinyint(4)
NULL: Yes
Default: 0

Resposta no navegador:
Incorrect integer value: '' for column 'quitacao' at row 1

Onde a falha?

zekkerj

Texto vazio não é um número válido.
Em tempo... se vc tem um campo numérico, o correto seria você lê-lo em uma entrada de texto, não num checkbox.
Checkboxes são pra você ler campos booleanos, verdadeiro ou falso, ligado ou desligado, aceso ou apagado, selecionado ou não selecionado, zero ou um...
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

Mas é isso, ou, é para ser isso.
Pago ou não pago, marca zero ou um.
E entendo que tinyint é um número inteiro pequeno, de 0 a 255 se não me engano.

zekkerj

Então esse campo deveria ser booleano, não um tinyint.
De qualquer forma, garanta que esse valor receba um valor numérico, não um "vazio".
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

Boa dica. Fiz por dentro do phpmyadmin, que executa no MySQL o comando:

ALTER TABLE 'mytable' CHANGE 'quitacao' 'quitacao' BOOLEAN NULL DEFAULT FALSE;

Feito isso, é apresentado como tinyint(1).
Nota: Quando seleciona a opção tinyint, ele coloca automaticamente tinyint(4).

Como continua tratando o campo como um número inteiro, repete-se a mensagem de erro.

zekkerj

fecha a sessão do phpMyAdmin e carrega de novo, pra limpar a visualização.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

#22
Mesmo erro...

Acho que as perguntas no momento são:

1) Quando um campo está marcado como NULL no db, significa que ele o valor a ele atribuído pode ser nulo?
2) O tipo de dado (VAR, INT, etc) interfere na questão de ser nulo?
3) O valor default selecionado como 0 (zero), não deveria ser atribuído na inserção, excluindo a condição de nulo?

Um teste:
Marquei o campo 'datavenc' no db como NULL e tentei fazer a inclusão. Mesagem de erro:
Incorrect date value: '' for column 'datavenc' at row 1
É como se o NULL não mudasse nada.

zekkerj

Você ainda não pegou o tchan do problema...
Acontece que '' (string vazia) não é NULL!!!

NULL é um campo que não foi preenchido.

String vazia é uma string de comprimento zero.

São valores diferentes...
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

Hmmm, como permitir salvar o seguinte form enquanto apenas a 'datavenc' é  preenchida?



<input type="date" name="datavenc" value="<?php echo $datavenc; ?>" >
<input type="checkbox" name="quitacao" id="quitacao"
value="<?php echo $quitacao; ?>" <?php if ($quitacao=='1') { echo ' checked '; } ?> />
<input type="date" name="dataquit" value="<?php echo $dataquit; ?>" >

$query = "INSERT INTO mytable (datavenc, quitacao, dataquit) VALUES ('$datavenc','$quitacao','$dataquit')";

Name: datavenc
Type: date
NULL: Yes

Name: quitacao
Type: tinyint(1)
NULL: Yes
Default: 0

Name: dataquit
Type: date
NULL: Yes

zekkerj

Quando vc quer que um registro seja inserido mantendo alguns campos como NULL, omita esses campos da instrução de inserção. Ou seja, em vez de

INSERT INTO mytable (datavenc, quitacao, dataquit) VALUES ('$datavenc','$quitacao','$dataquit')

faça:

INSERT INTO mytable (datavenc) VALUES ('$datavenc')
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov

Acredito que funcione, Evita-se passar pelo NULL. Se não conseguir resolver, vou ver se tem como mudar o script.

Mas imagina um prontuário médico onde tem que salvar o nome do paciente e uma checkbox indicando se ele é cardíaco. Não seria possível salvar um registro do não-cardíaco, né?

zekkerj

Você passa o valor "FALSE" para "cardíaco", não "" (vazio).
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

maurov


maurov

Tentei, mas não consegui entender.
Se eu usar FALSE como nestes exemplos da web, não tenho como atualizar a variável :
INSERT INTO first VALUES (NULL, 'G22', TRUE);
INSERT INTO first VALUES (NULL, 'G23', FALSE);