Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Prove Yourself

[Resolvido] Campo date salvando 0000-00-00

Recommended Posts

Tenho a seguinte tabela MySQL:

CREATE TABLE IF NOT EXISTS `projetos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `descricao` text NOT NULL,
  `data_recebimento` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
E o seguinte código que insere a data no banco, método insert():

project.php

<?php
class Project {
	private $description;
	private $files;
	private $receiveDate;

	public function __construct($description, $files = null, $receiveDate = null) {
		$this->description = $description;

		if(is_array($files)) {
			$this->files = $files;
		}
		else {
			$this->files = array();
			$this->addFile($file);
		}

		$this->receiveDate = $receiveDate;
	}

	public function addFile(File $file) {
		array_push($this->files, $file);
	}

	public function insert() {
		$database = Connection::getConnection();

		$statement = $database->prepare("INSERT INTO projetos (descricao, data_recebimento) VALUES ('?', '?')");

		$statement->bindParam(1, $this->description);
		$statement->bindParam(2, $this->receiveDate);

		$statement->execute();
	}
}
?>
formulario:
<?php
require_once('../classes/connection.php');
require_once('../classes/project.php');

// Next month = days multiplied by hours multiplied by minutes multiplied by seconds...
$nextMonth = date('d/m/Y', (time() + (30 * 24 * 60 * 60)));

if(isset($_POST) && !empty($_POST)) {
	$description = isset($_POST['description']) && !empty($_POST['description']) ? $_POST['description'] : '';
	
	$files = array();

	if(isset($_FILES) && !empty($_FILES)) {
		foreach($_FILES as $file) {
			if(isset($file['name']) && !empty($file['name'])) {
				array_push($files, $file);
			}
		}
	}
	$receiveDate = isset($_POST['receivedate']) && !empty($_POST['receivedate']) ? $_POST['receivedate'] : '';

	if(!empty($receiveDate)) {
		$explodedDate = explode('/', $receiveDate);

		$day = $explodedDate[0];
		$month = $explodedDate[1];
		$year = $explodedDate[2];
		
		$timestamp = mktime(null, null, null, $month, $day, $year);
		$receiveDate = date('Y-m-d', $timestamp);
	}

	$project = new Project($description, $files, $receiveDate);
	$project->insert();
}
?>
<html>
	<head>
	</head>
	<body>
		<form method="post" enctype="multipart/form-data">
			<fieldset>
				<label for="description">Description</label>
				<textarea id="description" name="description"></textarea>
				<fieldset>
					<label for="file1" />File</label>
					<input id="file1" name="file1" type="file" />
					<label for="file2" />File</label>
					<input id="file2" name="file2" type="file" />
					<label for="file3" />File</label>
					<input id="file3" name="file3" type="file" />
					<label for="file4" />File</label>
					<input id="file4" name="file4" type="file" />
				</fieldset>
				<label for="receivedate">Receive Date</label>
				<input id="receivedate" name="receivedate" type="text" value="<?php echo isset($nextMonth) && !empty($nextMonth) ? $nextMonth : null ?>" />
				<input id="submit" name="submit" type="submit" />
			</fieldset>
		</form>
	</body>
</html>
O problema é que a hora vai para o banco como 0000-00-00. Eu conferi e a data chega correta no objeto que insere.

 

Alguém pode me ajudar? Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

// Next month = days multiplied by hours multiplied by minutes multiplied by seconds...
$nextMonth = date('d/m/Y', (time() + (30 * 24 * 60 * 60)));

Substitua a linha acima pelo formato correto do banco de dados YYYY-MM-DD:

$nextMonth = date( 'Y-m-d' , time() + ( 30 * 24 * 60 * 60 ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, obrigado pela ajuda!

 

Se vocẽ olhar, já estou convertendo a data para o formato do MySQL. Não posso converter a data antes porque quero exibi-la no nosso formato dentro do input.

 

Eu acredito que seja algum problema no PDO já que, se eu inserir uma string de hora válida direto no bindParam, ele também insere um monte de zeros...

$d = '2010-04-16';
$statement->bindParam(2, $d);
A única forma que funciona é indo direto no banco (console MySQL ou PHPMyAdmin). Bem estranho :S

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, o erro está na sua instrução SQL, substitua por:

 

$statement = $database->prepare("INSERT INTO projetos (descricao, data_recebimento) VALUES (?,?)"); //Aqui estava o erro
$statement->bindParam(1, $this->description);
$statement->bindParam(2, $this->receiveDate);

 

O PDO, quando você não informa o terceiro argumento no método bindParam() ele assume PDO::PARAM_STR, que faz com que seja inserido as aspas automaticamente, como sua consulta está com a data alguma coisa assim: 2010-04-16 e já estava informando as aspas, estava sendo inserido '2010-04-16' com as aspas, onde invalida a data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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