Jump to content


Photo

Problemas Com $_post (valor Numérico)!


  • Faça o login para participar
36 replies to this topic

#16 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 11/11/2009, 10:35

Desculpe o double post novamente, mas alguém teria alguma solução ainda?

Brother, o problema aí é que tu tem centenas de consultas e está usando uma mesma variável para verificar o retorno da operação. Criar centenas de variáveis e verificar todas elas seria loucura... O mais indicado é fazer o que tu já deveria estar fazendo: executar uma consulta apenas, por mais que existam centenas de campos.

Uma prepared statatement pode lhe ajudar. Considerando que tu use a biblioteca PDO para tal, que eu uso e recomendo, seria algo assim:

<?php

$bd = new PDO('mysql:dbname=banco;host=127.0.0.1', 'usuario', 'senha');
$stmt = $bd->prepare('INSERT INTO tabela VALUES (?, ?, ?)');
$stmt->bindValue(1, 'valor campo1');
$stmt->bindValue(2, 'valor campo2');
$stmt->bindValue(3, 'valor campo3');

if ($stmt->execute()) {
	// Ok
} else {
	// mensagem de erro
	print_r($stmt->errorInfo()); // remover isto em produção
}

?>
Você também pode especificar quais os campos, caso seja necessário:

$stmt = $bd->prepare('INSERT INTO tabela (campo1, campo2, campo3) VALUES (?, ?, ?)');
E por aí vai. As possibilidades são muitas. :)

Detalhe: Neste caso você não precisa usar a função mysql_real_escape_string(). Nas prepared statements do PDO isso é feito automagicamente. =)

[]’sAté mais

#17 Squall Robert

Squall Robert

    Mr. Squall - Mais Carne do que Osso (hihi)

  • Usuários
  • 507 posts
  • Sexo:Masculino
  • Localidade:Curitiba
  • Interesses:Php ... Php...Php

Posted 11/11/2009, 12:21

ma... se ta fazendo complicção... mas ja que vc esta usando numeros no seu banco que deve esta estranho mas vamos la


no forms vc pode fazer assimm


em todos os campos que são passados por GET ou POST


vc vai renomer esse assimm



c_01
c_02

e assim por diante


ai na coleta vc coleta assim


$_POST['c_01'];

e por ai vai...


no mysql

01 ='{$_POST[c_01]}'

podendo assim usar no where order having group

e onde vc achar necessário
<?php

$squall = new Squall();

$squall->Ajudando("você");

$resultado = $squall->solucao();  ?>

#18 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 06:57

Desculpe o double post novamente, mas alguém teria alguma solução ainda?

Brother, o problema aí é que tu tem centenas de consultas e está usando uma mesma variável para verificar o retorno da operação. Criar centenas de variáveis e verificar todas elas seria loucura... O mais indicado é fazer o que tu já deveria estar fazendo: executar uma consulta apenas, por mais que existam centenas de campos.

Uma prepared statatement pode lhe ajudar. Considerando que tu use a biblioteca PDO para tal, que eu uso e recomendo, seria algo assim:

<?php

$bd = new PDO('mysql:dbname=banco;host=127.0.0.1', 'usuario', 'senha');
$stmt = $bd->prepare('INSERT INTO tabela VALUES (?, ?, ?)');
$stmt->bindValue(1, 'valor campo1');
$stmt->bindValue(2, 'valor campo2');
$stmt->bindValue(3, 'valor campo3');

if ($stmt->execute()) {
	// Ok
} else {
	print $stmt->errorInfo();
}

?>
Você também pode especificar quais os campos, caso seja necessário:

$stmt = $bd->prepare('INSERT INTO tabela (campo1, campo2, campo3) VALUES (?, ?, ?)');
E por aí vai. As possibilidades são muitas. :)

Detalhe: Neste caso você não precisa usar a função mysql_real_escape_string(). Nas prepared statements do PDO isso é feito automagicamente. =)

[]’s


Tentei fazer com seu exemplo acima mas ele retorna um erro escrito:
Array

Falando que os números parâmetros não coincidem com sei lá o que..
O estranho é que no meu código anterior, eu tentei fazer somente uma consulta ao banco de dados, ele imprime a mensagem de sucesso mas nada acontece na alteração da estrutura.

Muito estranho..

#19 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 07:14

Tentei fazer com seu exemplo acima mas ele retorna um erro escrito:
Array

Falando que os números parâmetros não coincidem com sei lá o que..
O estranho é que no meu código anterior, eu tentei fazer somente uma consulta ao banco de dados, ele imprime a mensagem de sucesso mas nada acontece na alteração da estrutura.

Muito estranho..

Perdão, a parte do Array é que eu usei print ao invés de print_r(). Se a condição está caindo nesta parte é porque a consulta está errada de alguma forma. Como tu disse, o número de parâmetros não deve coincidir com o número de campos.

Explicando:

$stmt = $bd->prepare('INSERT INTO tabela VALUES (?, ?, ?)');
$stmt->bindValue(1, 'valor campo1');
Para cada campo da tabela (caso acima) ou campo especificado na consulta tu deve informar um sinal de interrogação dentro de VALUES e uma chamada ao método $stmt->bindValue() ao campo correspondente. Capiche? :)

[]’sAté mais

#20 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 07:20

Tentei fazer com seu exemplo acima mas ele retorna um erro escrito:
Array

Falando que os números parâmetros não coincidem com sei lá o que..
O estranho é que no meu código anterior, eu tentei fazer somente uma consulta ao banco de dados, ele imprime a mensagem de sucesso mas nada acontece na alteração da estrutura.

Muito estranho..

Perdão, a parte do Array é que eu usei print ao invés de print_r(). Se a condição está caindo nesta parte é porque a consulta está errada de alguma forma. Como tu disse, o número de parâmetros não deve coincidir com o número de campos.

Explicando:

$stmt = $bd->prepare('INSERT INTO tabela VALUES (?, ?, ?)');
$stmt->bindValue(1, 'valor campo1');
Para cada campo da tabela (caso acima) ou campo especificado na consulta tu deve informar um sinal de interrogação dentro de VALUES e uma chamada ao método $stmt->bindValue() ao campo correspondente. Capiche? :)

[]’s


Para iniciar, agradeço sua total atenção dispensada ao meu problema.

Eu entendi a lógica, mas não entendi como faço para especificar os valores adquiridos do $_POST['nome'] e atribuir a coluna Nome da tabela. E como eu posso restringir o WHERE no ID = $id do $_GET['id']; no PDO?

Obrigado.

#21 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 07:57

Para iniciar, agradeço sua total atenção dispensada ao meu problema.

Eu entendi a lógica, mas não entendi como faço para especificar os valores adquiridos do $_POST['nome'] e atribuir a coluna Nome da tabela. E como eu posso restringir o WHERE no ID = $id do $_GET['id']; no PDO?

Obrigado.

Vou pegar um exemplo ali do post #14:

<?php

$bd = new PDO('mysql:dbname=banco;host=127.0.0.1', 'usuario', 'senha');
$stmt = $bd->prepare('UPDATE `a_campo` SET `Senha` = :senha, `Visualizacao` = :visualizacao, `01` = :01, `02` = :02, `03` = :03 WHERE `id` = :id'); // para não se perder, ao invés de usar ponto de interrogação (?), use apelidos iniciados por dois-pontos (:)
$stmt->bindValue(':senha', $_POST['senha']);
$stmt->bindValue(':visualizacao', $_POST['visualizacao']);
$stmt->bindValue(':01', $_POST['01']);
$stmt->bindValue(':02', $_POST['03']);
$stmt->bindValue(':03', $_POST['02']);
$stmt->bindValue(':id', $_GET['codigo']);

if ($stmt->execute()) {
	// Ok
} else {
	 // mensagem de erro
	print_r($stmt->errorInfo()); // remover isto em produção
}

?>
Observação: Perceba que eu usei ticks (``) nos nomes dos campos da consulta. Sem eles a consulta não é executada - os campos iniciados por números necessitam o seu uso. ;-)

[]’sAté mais

#22 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 08:34

Para iniciar, agradeço sua total atenção dispensada ao meu problema.

Eu entendi a lógica, mas não entendi como faço para especificar os valores adquiridos do $_POST['nome'] e atribuir a coluna Nome da tabela. E como eu posso restringir o WHERE no ID = $id do $_GET['id']; no PDO?

Obrigado.

Vou pegar um exemplo ali do post #14:

<?php

$bd = new PDO('mysql:dbname=banco;host=127.0.0.1', 'usuario', 'senha');
$stmt = $bd->prepare('UPDATE `a_campo` SET `Senha` = :senha, `Visualizacao` = :visualizacao, `01` = :01, `02` = :02, `03` = :03 WHERE `id` = :id'); // para não se perder, ao invés de usar ponto de interrogação (?), use apelidos iniciados por dois-pontos (:)
$stmt->bindValue(':senha', $_POST['senha']);
$stmt->bindValue(':visualizacao', $_POST['visualizacao']);
$stmt->bindValue(':01', $_POST['01']);
$stmt->bindValue(':02', $_POST['03']);
$stmt->bindValue(':03', $_POST['02']);
$stmt->bindValue(':id', $_GET['codigo']);

if ($stmt->execute()) {
	// Ok
} else {
	 // mensagem de erro
	print_r($stmt->errorInfo()); // remover isto em produção
}

?>
Observação: Perceba que eu usei ticks (``) nos nomes dos campos da consulta. Sem eles a consulta não é executada - os campos iniciados por números necessitam o seu uso. ;-)

[]’s


Obrigado pela atenção Paulo Ricardo.

Eu alterei de acordo com as necessidades do meu formulário e recebi a mensagem de Ok.
Vou verificar no banco de dados e não há nenhuma alteração! Sendo que em where eu fiz a alteração de `id` para `ID` por ser case-sensitive.

Exemplo:
$stmt = $bd->prepare('UPDATE `a_tabela` SET `Senha` = :senha, `Nome` = :nome, `101` = :001, `102` = :002, `103` = :003 WHERE `ID` = :id');
$stmt->bindValue(':senha', $_POST['senha']);
$stmt->bindValue(':nome', $_POST['nome']);
$stmt->bindValue(':001', $_POST['101']);
$stmt->bindValue(':002', $_POST['102']);
$stmt->bindValue(':003', $_POST['103']);
$stmt->bindValue(':id', $_GET['codigo']);

Está certo? Quais são as probabilidades de erro?
Pode ser problema no servidor?

#23 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 09:14

Obrigado pela atenção Paulo Ricardo.

Eu alterei de acordo com as necessidades do meu formulário e recebi a mensagem de Ok.
Vou verificar no banco de dados e não há nenhuma alteração! Sendo que em where eu fiz a alteração de `id` para `ID` por ser case-sensitive.

[...]

Está certo? Quais são as probabilidades de erro?
Pode ser problema no servidor?

Eita! :(

No caso o auto-commit devia estar funcionando. :wacko: Eu criei uma tabela de teste aqui e executei a consulta, sem problemas, fui no phpMyAdmin e os valores foram modificados. :(

Veja se inserir esta linha após após a instanciação do objeto PDO funciona:

$bd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
[]’sAté mais

#24 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 17:06

Obrigado pela atenção Paulo Ricardo.

Eu alterei de acordo com as necessidades do meu formulário e recebi a mensagem de Ok.
Vou verificar no banco de dados e não há nenhuma alteração! Sendo que em where eu fiz a alteração de `id` para `ID` por ser case-sensitive.

[...]

Está certo? Quais são as probabilidades de erro?
Pode ser problema no servidor?

Eita! :(

No caso o auto-commit devia estar funcionando. :wacko: Eu criei uma tabela de teste aqui e executei a consulta, sem problemas, fui no phpMyAdmin e os valores foram modificados. :(

Veja se inserir esta linha após após a instanciação do objeto PDO funciona:

$bd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
[]’s


Obrigado Paulo Ricardo, porém, acrescentei a linha após a instanciação e não houve diferença.
Continuo tentando efetuar a alteração, recebendo a mensagem de Ok e nada acontece na estrutura.

??

#25 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 17:26

Obrigado Paulo Ricardo, porém, acrescentei a linha após a instanciação e não houve diferença.
Continuo tentando efetuar a alteração, recebendo a mensagem de Ok e nada acontece na estrutura.

??

Complicado meu velho! :(

Se entra na condição do Ok é porque aparentemente está tudo certo com a "consulta". :huh:

Para ter certeza do que eu recomendei eu inclusive criei uma tabela aqui no meu phpMyAdmin e executei o código de exemplo que eu havia postado, tudo funcionou normalmente, apareceu o Ok e no phpMyAdmin os dados apareceram modificados. Não dá para entender. :wacko:

Um tiro de misericórdia: o que aparece se você jogar o print_r($stmt->errorInfo()); na condição do Ok? :ponder:

[]’sAté mais

#26 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 20:50

Obrigado Paulo Ricardo, porém, acrescentei a linha após a instanciação e não houve diferença.
Continuo tentando efetuar a alteração, recebendo a mensagem de Ok e nada acontece na estrutura.

??

Complicado meu velho! :(

Se entra na condição do Ok é porque aparentemente está tudo certo com a "consulta". :huh:

Para ter certeza do que eu recomendei eu inclusive criei uma tabela aqui no meu phpMyAdmin e executei o código de exemplo que eu havia postado, tudo funcionou normalmente, apareceu o Ok e no phpMyAdmin os dados apareceram modificados. Não dá para entender. :wacko:

Um tiro de misericórdia: o que aparece se você jogar o print_r($stmt->errorInfo()); na condição do Ok? :ponder:

[]’s


O código retorna para mim:

Array ( [0] => 00000 )


Se eu usar:
$bd = new PDO('mysql:dbname=xxxxxxxxxxxx;host=xxxxxxxx.xxxxxxxxxxx.xxx', 'xxxxxxxxxxx', 'xxxxxxxxxxx');
$bd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $bd->prepare('UPDATE `a_campo` SET `Senha` = :senha, `Nome` = :nome where `ID` = :id');
$stmt->bindValue(':senha', $_POST['senha']);
$stmt->bindValue(':nome', $_POST['nome']);
$stmt->bindValue(':id', $_GET['codigo']);

Alguma luz?
Muito obrigado novamente.

#27 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 21:08

O código retorna para mim:

Array ( [0] => 00000 )


Se eu usar:
$bd = new PDO('mysql:dbname=xxxxxxxxxxxx;host=xxxxxxxx.xxxxxxxxxxx.xxx', 'xxxxxxxxxxx', 'xxxxxxxxxxx');
$bd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $bd->prepare('UPDATE `a_campo` SET `Senha` = :senha, `Nome` = :nome where `ID` = :id');
$stmt->bindValue(':senha', $_POST['senha']);
$stmt->bindValue(':nome', $_POST['nome']);
$stmt->bindValue(':id', $_GET['codigo']);

Alguma luz?
Muito obrigado novamente.

Bem, isso representa o que eu já desconfiava: nenhum erro. :huh:

Por padrão as conexões são auto-commited. Só seria necessário usar o método commit() para efetivamente efetuar as consultas se o método beginTransaction() tivesse sido usado antes - o que representaria o uso de transações. Não dá para entender! :(

Tudo indica que o código está certo. E diante disto eu já não sei mais o que poderia ser feito. :wacko:

[]’sAté mais

#28 GmEnDeS

GmEnDeS

    Turista

  • Usuários
  • 50 posts
  • Sexo:Não informado

Posted 12/11/2009, 21:23

Bem, isso representa o que eu já desconfiava: nenhum erro. :huh:

Por padrão as conexões são auto-commited. Só seria necessário usar o método commit() para efetivamente efetuar as consultas se o método beginTransaction() tivesse sido usado antes - o que representaria o uso de transações. Não dá para entender! :(

Tudo indica que o código está certo. E diante disto eu já não sei mais o que poderia ser feito. :wacko:

[]’s


Realmente, nos deixa confuso.
Então, o problema é no servidor? Alguma função pode estar desativada?
Devo entrar em contato com o suporte da hospedagem para exclarecer?

#29 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 12/11/2009, 21:37

Realmente, nos deixa confuso.
Então, o problema é no servidor? Alguma função pode estar desativada?
Devo entrar em contato com o suporte da hospedagem para exclarecer?

O que não dá para entender é que houvesse algum problema ele seria apresentado. :wacko:

Se você jogar um error_reporting(E_ALL); no início da página não modifica nada, não? :ponder:

Um contato com o suporte da hospedagem seria interessante. (y)

[]’sAté mais

#30 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 13/11/2009, 01:31

Se no código não tem erros, é possível que os valores não estejam sendo passados para a página. :ponder:

Dê um print_r($_POST) e print_r($_GET) para ver se os valores foram passados corretamente. Cole o resultado aqui. ;)

No seu lugar, eu tentaria localizar o problema desde o mais simples. Tentaria executar uma query update no phpmyadmin e depois a mesma query com a função mysql_query. Eu começaria colocando os valores direto na query. Exemplo:

UPDATE a_campo SET Senha = '123456', Nome = 'José' WHERE ID = '1'

Depois tentaria com valores dinâmicos, e assim vai...

Você tem que ir desenvolvendo o código dando passos pequenos, vendo se está funcionando a cada passo. Só assim você vai encontrar o problema.
att,
Muller Dias
ex-administrador Fórum WMO




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq