Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou tentando adaptar o inserte que retorne o ultimo id. mas não sei como fazer nesse codigo
public function Cadastrar(Turma $turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES "
. "(:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
// ":maxvaga" => $turma->getMaxvaga(),
// ":minvaga" => $turma->getMinvaga()
);
return $this->pdo->ExecuteNonQuery($sql, $param);
return $this->pdo->lastInsertId();
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}Não sei como fazer isso???
// adicionei essa linha
private $lastid;
public function Cadastrar(Turma $turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES "
. "(:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
// ":maxvaga" => $turma->getMaxvaga(),
// ":minvaga" => $turma->getMinvaga()
);
// adicionei essa linha
$this->setLastId($this->pdo->lastInsertId());
return $this->pdo->ExecuteNonQuery($sql, $param);
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}
// adicionei esses métodos
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}
Alterei o código
Adicionei esses trechos:
$this->setLastId($this->pdo->lastInsertId());
setLastId() vai setar o último ID.
public function getLastId(){
return $this->lastid;
}
pelo método getLastId() você vai conseguir pegar o último id.
aí onde você usa a classe que tem o método Cadastrar, é só você fazer algo assim:
$exemplo = new Classe();
$exemplo->Cadastrar("turma 2018");Se tiver com dificuldade poem todo seu código aí pra gente ver e tentar ajudar.
Muito Obrigado pela a dica:
e se eu quiser fazer um teste. como dar para fazer?
é que esse código está dentro de um DAO, passa pelo Controller e só depois vai pra a VIEW.
resumindo! eu são sei como testar esse código.
Desculpe minha ignorância! mas estou começando agora a trabalhar com orientação a objetos.
>
5 minutos atrás, gedmilson disse:
Muito Obrigado pela a dica:
e se eu quiser fazer um teste. como dar para fazer?
é que esse código está dentro de um DAO, passa pelo Controller e só depois vai pra a VIEW.
resumindo! eu são sei como testar esse código.
Abre um arquivo em branco no seu servidor, test_classe.php só pra fazer esse teste, aí você chama a classe onde está esse método Cadastrar.
require_once("caminho/ate/a/classe");
$instancia = new Classe(); // instancia a classe
$instancia->Cadastrar("turma 2018"); // chama o método
$instancia->getLastId(); // chama o método
>
2 minutos atrás, gedmilson disse:
Desculpe minha ignorância! mas estou começando agora a trabalhar com orientação a objetos.
Que isso, esquenta a cabeça não, o negócio é perguntar mesmo e ir testando.
Eu fiz uma classe parecida com essa na view
require_once("../Controller/CategoriaController.php");
vou tentar chama do jeito que esta me dizendo.
Muito obrigado pela a sua ajuda..Dando require_once em CategoriaController.php você consegue chamar a classe onde está o método Cadastrar()?
Tentei fazer dessa forma.
print_r($turmaController->getLastId());
mas parece que não deu certoRetornou algum erro?
Não retornou nada
Ai eu tentei fazer dessa forma
$MaxId = $turmaController->getLastId();
echo $MaxId;
e também não obtive nenhum exito.Você fez as alterações com o código que te passei na classe que você ta chamando? Qual é o nome da classe? Consegue por ela inteira aqui?
Pq pro getLastId() funcionar precisa dessas alterações na classe onde ta o método Cadastrar():
// adicionar a propriedade $lastid
private $lastid;
// adicionar essa linha dentro do método Cadastrar, uma linha antes de return;
$this->setLastId($this->pdo->lastInsertId());
// adicionar esses 2 métodos
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}vou colocar
require_once("Banco.php");
class TurmaDAO {
private $pdo;
private $debug;
public function __construct() {
$this->pdo = new Banco();
$this->debug = true;
}
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}
public function Cadastrar(Turma $turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES "
. "(:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
);
$this->setLastId($this->pdo->lastInsertId());
// adicionar esses 2 métodos
return array(
"result_query" => $this->pdo->ExecuteNonQuery($sql, $param),
"last_id" => $this->pdo->lastInsertId($sql)
);
return $this->pdo->ExecuteNonQuery($sql, $param);
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}
}
Inseri o seu código logo acima.Poem o seu código do Banco.php aqui também pra eu dar uma olhada, retira a senha, o nome do banco e o nome do usuário.
<?php
date_default_timezone_set('America/Sao_Paulo');
/**
* PDO PHP Persistence Class
* https://github.com/victortassinari/pdophpclass
*
*
* @author Victor Tassinari - victortassinarix@gmail.com
*/
class Banco {
private static $connection;
private $debug;
private $server;
private $user;
private $password;
private $database;
public function __construct() {
$this->debug = true;
$this->server = "";
$this->user = "";
$this->password = "";
$this->database = "";
}
/**
* Create a database connection or return the connection already open using Singletion Design Patern
* @return PDOConnection|null
*/
public function getConnection() {
try {
if (self::$connection == null) {
self::$connection = new PDO("mysql:host={$this->server};dbname={$this->database};charset=utf8", $this->user, $this->password);
self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
self::$connection->setAttribute(PDO::ATTR_PERSISTENT, true);
}
return self::$connection;
} catch (PDOException $ex) {
if ($this->debug) {
echo "<b>Error on getConnection(): </b>" . $ex->getMessage() . "<br/>";
}
die();
return null;
}
}
/**
* Unset connection
* @return void
*/
public function Disconnect() {
$this->connection = null;
}
/**
* Return the last id of insert statement
* @return int
*/
public function GetLastID() {
return $this->getConnection()->lastInsertId();
}
/**
* Start one database transaction
* @return void
*/
public function BeginTransaction() {
return $this->getConnection()->beginTransaction();
}
/**
* Commit changes on opened transaction
* @return void
*/
public function Commit() {
return $this->getConnection()->commit();
}
/**
* Roolback changes on opened transaction
* @return void
*/
public function Rollback() {
return $this->getConnection()->rollBack();
}
/**
* returns the result of a query (select) of only one row
* @param string $sql the sql string
* @param array $params the array of parameters (array(":col1" => "val1",":col2" => "val2"))
* @return one position array for the result of query
*/
public function ExecuteQueryOneRow($sql, $params = null) {
try {
$stmt = $this->getConnection()->prepare($sql);
$stmt->execute($params);
return $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $ex) {
if ($this->debug) {
echo "<b>Error on ExecuteQueryOneRow():</b> " . $ex->getMessage() . "<br />";
echo "<br /><b>SQL: </b>" . $sql . "<br />";
echo "<br /><b>Parameters: </b>";
print_r($params) . "<br />";
}
die();
return null;
}
}
/**
* returns the result of a query (select)
* @param string $sql the sql string
* @param array $params the array of parameters (array(":col1" => "val1",":col2" => "val2"))
* @return array for the result of query
*/
public function ExecuteQuery($sql, $params = null) {
try {
$stmt = $this->getConnection()->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $ex) {
if ($this->debug) {
echo "<b>Error on ExecuteQuery():</b> " . $ex->getMessage() . "<br />";
echo "<br /><b>SQL: </b>" . $sql . "<br />";
echo "<br /><b>Parameters: </b>";
print_r($params) . "<br />";
}
die();
return null;
}
}
/**
* returns if the query was successful
* @param string $sql the sql string
* @param array $params the array of parameters (array(":col1" => "val1",":col2" => "val2"))
* @return boolean
*/
public function ExecuteNonQuery($sql, $params = null) {
try {
$stmt = $this->getConnection()->prepare($sql);
return $stmt->execute($params);
} catch (PDOException $ex) {
if ($this->debug) {
echo "<b>Error on ExecuteNonQuery():</b> " . $ex->getMessage() . "<br />";
echo "<br /><b>SQL: </b>" . $sql . "<br />";
echo "<br /><b>Parameters: </b>";
print_r($params) . "<br />";
}
die();
return false;
}
}
}Na sua classe Banco já possui um método pra pegar o último id, o nome do método é GetLastId(), ta na linha 65.
Agora faz o seguinte, troca sua classe turmaDAO inteira por essa aqui:
require_once("Banco.php");
class TurmaDAO {
private $pdo;
private $debug;
private $lastid;
public function __construct() {
$this->pdo = new Banco();
$this->debug = true;
}
public function Cadastrar($turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES "
. "(:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
// ":maxvaga" => $turma->getMaxvaga(),
// ":minvaga" => $turma->getMinvaga()
);
$res = $this->pdo->ExecuteNonQuery($sql, $param);
$this->setLastId($this->pdo->GetLastId());
return $res;
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}
}
Agora vai lá naquele seu arquivo de teste e poem esse código aqui:
require_once("../seucontroller");
$turma = new TurmaDAO();
echo "<pre>";
print_r($turma->Cadastrar(seus parametros));
echo "</pre>";
echo "<pre>";
print_r($turma->getLastId());
echo "</pre>";
Testei aqui e funcionou, agora é fazer funcionar aí no seu servidor.Eu mudei o
require_once("../seucontroller");
para
require_once("../Controller/TurmaController.php");
$turma = new TurmaDAO();
echo "<pre>";
print_r($turma->Cadastrar($turma));
echo "</pre>";
echo "<pre>";
print_r($turma->getLastId());
echo "</pre>";
apareceu esse erro
Fatal error: Call to undefined method TurmaDAO::getTurma() in C:\xampp\htdocs\IPAE\DAL\TurmaDAO.php on line 22
Eu tinha tirado o "Turma" de: Cadastrar(Turma $turma), não sei se isso interfere, coloquei novamente, testa aí e vê se vai agora:
require_once("Banco.php");
class TurmaDAO {
private $pdo;
private $debug;
private $lastid;
public function __construct() {
$this->pdo = new Banco();
$this->debug = true;
}
public function Cadastrar(Turma $turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES (:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
// ":maxvaga" => $turma->getMaxvaga(),
// ":minvaga" => $turma->getMinvaga()
);
$res = $this->pdo->ExecuteNonQuery($sql, $param);
$this->setLastId($this->pdo->GetLastId());
return $res;
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}
}Eu coloquei o arquivo que você fez na Model
class Turma {
private $lastid;
function getLastId(){
return $this->lastid;
}
function setLastId($id){
$this->lastid = $id;
}
}
Junto com as outras, parou de dar erros mas não tive nenhuma mensagem.Mas essa classe turma é outra classe, se você só colocar os métodos dentro dela não vai funcionar não. Testou a classe TurmaDAO?
sim testei quando coloco a classe TurmaDAO ela não reconhece as outros classes
Testou com esse novo?
Nesse aqui eu recoloquei o "Turma" que estava aqui: Cadastrar(Turma $turma), eu tinha tirado e tinha esquecido de recolocar, talvez ele chama algo da Classe Turma, não sei ao certo.
Testa esse pra gente ver:
require_once("Banco.php");
class TurmaDAO {
private $pdo;
private $debug;
private $lastid;
public function __construct() {
$this->pdo = new Banco();
$this->debug = true;
}
public function Cadastrar(Turma $turma) {
try {
$sql = "INSERT INTO turma (turma, nivel, descricao, cargahoraria,endereco, cidade) VALUES (:turma, :nivel, :descricao, :cargahoraria, :endereco, :cidade)";
$param = array(
":turma" => $turma->getTurma(),
":nivel" => $turma->getNivel(),
":descricao" => $turma->getDescricao(),
":cargahoraria" => $turma->getCarga(),
":endereco" => $turma->getEndereco(),
":cidade" => $turma->getCidade()
// ":maxvaga" => $turma->getMaxvaga(),
// ":minvaga" => $turma->getMinvaga()
);
$res = $this->pdo->ExecuteNonQuery($sql, $param);
$this->setLastId($this->pdo->GetLastId());
return $res;
} catch (PDOException $ex) {
if ($this->debug) {
echo "ERRO: {$ex->getMessage()} LINE: {$ex->getLine()}";
}
return false;
}
}
public function getLastId(){
return $this->lastid;
}
public function setLastId($id){
$this->lastid = $id;
}
}Eu retirei todos os codigos php da pagina deixando só os que você me enviou, para ver se dava de resouver isoladamente esse problema sem distração de nenhum outro codigo.
Mas tem que funcionar com os outros também, a alteração que a gente fez foi bem simples, acrescentamos só 2 métodos onde $this->setLastId() seta o último ID cadastrado e disponibiliza ele no método getLastId(), essa parte foi resolvida, o que é preciso ver agora é essa parte aqui: Cadastrar(**Turma** **$turma**), é como se na variável **$turma** fosse passado todos os métodos da classe **Turma**:
function Cadastrar(Turma $turma){
$turma->getTurma(),
$turma->getTurma(),
$turma->getNivel(),
$turma->getDescricao(),
$turma->getCarga(),
$turma->getEndereco(),
$turma->getCidade()
}
Testou o último código que te passei? Tem que testar ele com todos os códigos.Eu colei o código que você me enviou na pasta TurmaDAO.php
e depois colei esse código na TurmaView.php:
require_once("../Controller/TurmaController.php");
$turma = new TurmaDAO();
//$tur = new Turma();
echo "<pre>";
print_r($turma->Cadastrar());
echo "</pre>";
echo "<pre>";
print_r($turma->getLastId());
echo "</pre>";
?>
Tomei o cuidado de remover todos os outros códigos em php, para que não atrapalhassem.
mas mesmo assim apareceu esse erro:
Catchable fatal error: Argument 1 passed to TurmaDAO::Cadastrar() must be an instance of Turma, none given, called in C:\xampp\htdocs\IPAE\Admin-bc\View\TurmaView\TurmaView.php on line 9 and defined in C:\xampp\htdocs\IPAE\DAL\TurmaDAO.php on line 16
Onde você está errando é nesse trecho aqui: