Giihh 6 Denunciar post Postado Agosto 13, 2015 Olá, Estou aprendendo crud básico com PDO Orientado a Objetos. Arquivo class.crud.php <?php class crud { private $db; function __construct($DB_con) { $this->db = $DB_con; } public function create($fname,$lname,$email,$contact) { try { $stmt = $this->db->prepare("INSERT INTO tbl_users(first_name,last_name,email_id,contact_no) VALUES(:fname, :lname, :email, :contact)"); $stmt->bindparam(":fname",$fname); $stmt->bindparam(":lname",$lname); $stmt->bindparam(":email",$email); $stmt->bindparam(":contact",$contact); $stmt->execute(); return true; } catch(PDOException $e) { echo $e->getMessage(); return false; } } public function getID($id) { $stmt = $this->db->prepare("SELECT * FROM tbl_users WHERE id=:id"); $stmt->execute(array(":id"=>$id)); $editRow=$stmt->fetch(PDO::FETCH_ASSOC); return $editRow; } public function update($id,$fname,$lname,$email,$contact) { try { $stmt=$this->db->prepare("UPDATE tbl_users SET first_name=:fname, last_name=:lname, email_id=:email, contact_no=:contact WHERE id=:id "); $stmt->bindparam(":fname",$fname); $stmt->bindparam(":lname",$lname); $stmt->bindparam(":email",$email); $stmt->bindparam(":contact",$contact); $stmt->bindparam(":id",$id); $stmt->execute(); return true; } catch(PDOException $e) { echo $e->getMessage(); return false; } } public function delete($id) { $stmt = $this->db->prepare("DELETE FROM tbl_users WHERE id=:id"); $stmt->bindparam(":id",$id); $stmt->execute(); return true; } } Exemplo arquivo inserir.php usando a function create <?php include_once 'dbconfig.php'; if(isset($_POST['btn-save'])) { $fname = strip_tags(trim($_POST['first_name'])); $lname = strip_tags(trim($_POST['last_name'])); $email = strip_tags(trim($_POST['email_id'])); $contact = strip_tags(trim($_POST['contact_no'])); if($crud->create($fname,$lname,$email,$contact)) { header("Location: add-data.php?inserted"); } else { header("Location: add-data.php?failure"); } } include_once 'header.php'; ?> <div class="clearfix"></div> <?php if(isset($_GET['inserted'])) { ?> <div class="container"> <div class="alert alert-info"> <strong>WOW!</strong> Record was inserted successfully <a href="index.php">HOME</a>! </div> </div> <?php } else if(isset($_GET['failure'])) { ?> <div class="container"> <div class="alert alert-warning"> <strong>SORRY!</strong> ERROR while inserting record ! </div> </div> <?php } ?> <div class="clearfix"></div><br /> <div class="container"> <form method='post'> <table class='table table-bordered'> <tr> <td>First Name</td> <td><input type='text' name='first_name' class='form-control' required></td> </tr> <tr> <td>Last Name</td> <td><input type='text' name='last_name' class='form-control' required></td> </tr> <tr> <td>Your E-mail ID</td> <td><input type='text' name='email_id' class='form-control' required></td> </tr> <tr> <td>Contact No</td> <td><input type='text' name='contact_no' class='form-control' required></td> </tr> <tr> <td colspan="2"> <button type="submit" class="btn btn-primary" name="btn-save"> <span class="glyphicon glyphicon-plus"></span> Create New Record </button> <a href="index.php" class="btn btn-large btn-success"><i class="glyphicon glyphicon-backward"></i> Back to index</a> </td> </tr> </table> </form> </div> <?php include_once 'footer.php'; ?> Agora no arquivo paginas.php estou tentando fazer com que no url apareça o id de cada usuário e imprimir a linha referente a esse id... como por exemplo em uma tag h3 o conteudo da coluna fname, e as demais colunas da linha em locais diferentes na página. <h3>Nome do Usuario<3> Estou fazendo assim: // no arquivo class.crud.php criei a function verdados public function verdados($query) { $stmt = $this->db->prepare($query); $stmt->execute(); } // aqui no arquivo paginas.php é onde estou tentando exibir conteudos por id do usuario <?php include_once 'dbconfig.php'; require "header.php"; ?> <?php $query = "SELECT * FROM dados"; $crud->verdados($query); ?> /* retirei codigos html */ <h3><?php echo ['first_name']?> <h3/> //aqui é onde deve imprimir o nome do usuario <?php require "footer.php"; ?> Sei que deve ter erros "gritantes", mas preciso de ajuda pra criar esse primeiro select em pdo, e orientações de onde estou errando Ai a duvida também é como usar o $_GET['id'] nessa situação pra imprimir no url Agradeço ajuda Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 13, 2015 no arquivo paginas.php tentei assim também: <?php include_once 'dbconfig.php'; require "header.php"; ?> <?php $query = "SELECT * FROM dados"; while ($linha = $crud->verdados($query)->fetch(PDO::FETCH_ASSOC)) { ?> /* retirei codigos html */ <h3><?php echo $linha['first_name']?> <h3/> //aqui é onde deve imprimir o nome do usuario <?php } ?> <?php require "footer.php"; ?> mas não vai, aparece o erro Fatal error: Call to a member function fetch() on a non-object Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 13, 2015 Seu código tem inúmeros problemas, a classe CRUD infelizmente não passa de um conjunto de funções estáticas, tirando a PDO é claro. Recomendo estudar alguns padrões de projeto. http://www.devmedia.com.br/introducao-ao-padrao-mvc/29308 http://www.devmedia.com.br/dao-pattern-persistencia-de-dados-utilizando-o-padrao-dao/30999 http://www.devmedia.com.br/design-patterns-descricoes-dos-padroes-gof-parte-2/16781 Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 13, 2015 Obrigada Williams, Model é model, view é view e controler é controler e a classe realmente é "estatica". Mas esse é um exemplo simples, sem muita exigência quanto aos padrões de desenvolvimento, estou trabalhando mais a lógica básica e explorando o PDO Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 13, 2015 Ok! B) De um return em $stmt->fetch(PDO::FETCH_ASSOC) dentro da função e percorra o array com foreach ... $stmt = $this->db->prepare($query); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); ... ... $variable = $crud->verdados($query); foreach ($variable as $key => $value) { # code... } Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 13, 2015 Obrigada :D Então Willian essa parte faz o que? ($variable as $key => $value) Entendi assim: $key tem conteúdo de $variable e esse $value contém um array? ficando assim pra impimir: <php $variable = $crud->verdados($query); foreach ($variable as $key => $value) { ?> //conteudo html <h3><?php echo $value['nome_da_coluna_no_db']?> <h3/>. //conteudo html <?php } ?> Aqui deu erro Warning: Illegal string offset na linha que contém echo $value['nome_da_coluna_no_db'] Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 13, 2015 // Explicando foreach ($variavel_que_foi_setada_o_array as $indice_do_array => $valor_do_array) { de um um print_r() em $variavel_que_foi_setada_o_array e poste aqui $variavel_que_foi_setada_o_array = $crud->verdados($query); echo '<pre>'; print_r($variavel_que_foi_setada_o_array); echo '</pre>'; coloque esta função dentro do bloco try/catch para ver se vai reportar algum erro na query public function verdados($query) { try { $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $this->db->prepare($query); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('Error: ' . $e->getMessage() ); } } Eu particularmente gosto de tratar os dados como Objetos $obj = $stmt->fetch(PDO::FETCH_OBJ); echo $obj->nome_da_coluna_no_db; Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 13, 2015 No DB esta assim print_r($variable); Ta retornando: Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 14 Call Stack # Time Memory Function Location 1 0.0003 133848 {main}( ) ..\paginas.php:0 2 Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 14 Call Stack # Time Memory Function Location 1 0.0003 133848 {main}( ) ..\paginas.php:0 p Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 14 Call Stack # Time Memory Function Location 1 0.0003 133848 {main}( ) ..\paginas.php:0 k Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 14 Call Stack # Time Memory Function Location 1 0.0003 133848 {main}( ) ..\paginas.php:0 p Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 14 Call Stack # Time Memory Function Location 1 0.0003 133848 {main}( ) ..\paginas.php:0 9 class.crud.php esta asim public function verdados($query) { try { $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $this->db->prepare($query); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('Error: ' . $e->getMessage() ); } } paginas.php esta assim: <?php include_once 'dbconfig.php'; include_once 'header.php'; ?> <?php $query = "SELECT * FROM tbl_users"; $variable = $crud->verdados($query); foreach ($variable as $key => $value) { print_r($variable); ?> <div class="container"> <h3><?php echo $value['first_name'] ?></h3> </div> <?php } ?> <?php include_once 'footer.php'; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 13, 2015 Minha amiga eu quero somente o array $query = "SELECT * FROM tbl_users"; $variable = $crud->verdados($query); echo '<pre>'; print_r($variable); echo '</pre>'; Você está colocando uma variável de debug dentro de um loop? :blink: ,Te passei o link para ler, mas parece que ignorou a leitura sobre print_r e foreach, muito comum aqui no imasters, quanto menos estudar os links passados, mais tempo perdemos em achar a solução. ;) Obs.: Só está retornando uma linha, se você quer retornar somente uma linha, passe o ID na query, neste caso não é necessário uso do foreach, mas se quiser retornar todos, ai sim percorra com foreach. Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 13, 2015 rsrsr desculpa, já entrei nos links que você passou muitas vezes, acontece que tem coisas no manual que tem que fazer na pratica pra aprender, já que abordagem não é tão adequada para iniciantes. Sobre o printr dentro do loop foi uma grande falta de atenção. Segue: Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 15 Call Stack # Time Memory Function Location 1 0.0009 133480 {main}( ) ..\paginas.php:0 2 ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 15 Call Stack # Time Memory Function Location 1 0.0009 133480 {main}( ) ..\paginas.php:0 p ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 15 Call Stack # Time Memory Function Location 1 0.0009 133480 {main}( ) ..\paginas.php:0 k ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 15 Call Stack # Time Memory Function Location 1 0.0009 133480 {main}( ) ..\paginas.php:0 p ( ! ) Warning: Illegal string offset 'first_name' in C:\wamp\www\pdo\paginas.php on line 15 Call Stack # Time Memory Function Location 1 0.0009 133480 {main}( ) ..\paginas.php:0 9 Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 13, 2015 O problema é aqui return $stmt->fetch(PDO::FETCH_ASSOC); Este objeto fetch é para usar com while, e o abaixo, fetchAll é com foreach, return $stmt->fetchAll(PDO::FETCH_ASSOC); Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 14, 2015 Resultado: Array ( [0] => Array ( [id] => 23 [first_name] => prad [last_name] => khodke [email_id] => pradeep@gmail.com [contact_no] => 9876543210 ) [1] => Array ( [id] => 24 [first_name] => sohan [last_name] => mahamune [email_id] => sohan@gmail.com [contact_no] => 9874563210 ) [2] => Array ( [id] => 25 [first_name] => john [last_name] => doe [email_id] => john@someone.com [contact_no] => 9778456123 ) [3] => Array ( [id] => 26 [first_name] => test [last_name] => test [email_id] => test@test.com [contact_no] => 8745691230 ) ) prad sohan john test Imprimiu todos os nomes (joinha rsrs), mas vendo o resultado acho que serviria para uma possivel exibição de categoria (por exemplo todos os posts, de uma categoria). Mas nesse caso deve exibir apenas o conteúdo de um id. Como filtrar por id? Como usar o $_GET['id'] pra imprimir na url também? Depois vou aprender na prática a configurar o htaccess para ter url´s amigaveis Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 14, 2015 Basicamente da mesma forma que você usou na função delete! Só que desta vez, use mais uma constante chamada FETCH_ORI_LAST, com ela não é necessário percorrer o array, porque a função retorna um índice, dispensando o uso de foreach e while public function getId($id) { $stmt = $this->db->prepare("SELECT * FROM tbl_users WHERE id=:id"); $stmt->bindParam(":id",$id, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_LAST); } Claro que você pode deixar isso mais dinâmico, usando injeção de dependência, ou até mesmo o método magico __call, para criar seu getters e setters também de forma dinâmica, mas isso já é um estudo mais profundo. E não esqueça dos blocos try/catch Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 17, 2015 Boa tarde, Obrigada mais uma vez Willians, precisei estar ausente, retornando agora. Com o a function dataview consigo listar as linhas do DB na tabela, nisso consigo obter o id de cada linha e depois executar a function delete, já que tenho os id´s: public function dataview($query) { $stmt = $this->db->prepare($query); $stmt->execute(); if($stmt->rowCount()>0) { while($row=$stmt->fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?php print($row['first_name']); ?></td> <td><?php print($row['last_name']); ?></td> <td><?php print($row['email_id']); ?></td> <td><?php print($row['contact_no']); ?></td> <td align="center"> <a href="edit-data.php?edit_id=<?php print($row['id']); ?>"><i class="glyphicon glyphicon-edit"></i></a> </td> <td align="center"> <a href="delete.php?delete_id=<?php print($row['id']); ?>"><i class="glyphicon glyphicon-remove-circle"></i></a> </td> </tr> <?php } } else { ?> <tr> <td>Nada Aqui...</td> </tr> <?php } } public function delete($id) { $stmt = $this->db->prepare("DELETE FROM tbl_users WHERE id=:id"); $stmt->bindparam(":id",$id); $stmt->execute(); return true; } public function paging($query,$records_per_page) { $starting_position=0; if(isset($_GET["page_no"])) { $starting_position=($_GET["page_no"]-1)*$records_per_page; } $query2=$query." limit $starting_position,$records_per_page"; return $query2; } public function paginglink($query,$records_per_page) { $self = $_SERVER['PHP_SELF']; $stmt = $this->db->prepare($query); $stmt->execute(); $total_no_of_records = $stmt->rowCount(); if($total_no_of_records > 0) { ?><ul class="pagination"><?php $total_no_of_pages=ceil($total_no_of_records/$records_per_page); $current_page=1; if(isset($_GET["page_no"])) { $current_page=$_GET["page_no"]; } if($current_page!=1) { $previous =$current_page-1; echo "<li><a href='".$self."?page_no=1'>First</a></li>"; echo "<li><a href='".$self."?page_no=".$previous."'>Previous</a></li>"; } for($i=1;$i<=$total_no_of_pages;$i++) { if($i==$current_page) { echo "<li><a href='".$self."?page_no=".$i."' style='color:red;'>".$i."</a></li>"; } else { echo "<li><a href='".$self."?page_no=".$i."'>".$i."</a></li>"; } } if($current_page!=$total_no_of_pages) { $next=$current_page+1; echo "<li><a href='".$self."?page_no=".$next."'>Next</a></li>"; echo "<li><a href='".$self."?page_no=".$total_no_of_pages."'>Last</a></li>"; } ?></ul><?php } } Onde quero exibir esse trecho da tabela da function dataview, fica assim (junto com a paginação) : </tr> <?php $query = "SELECT * FROM tbl_users"; $records_per_page=20; $newquery = $crud->paging($query,$records_per_page); $crud->dataview($newquery); ?> <tr> <td colspan="10" align="center"> <div class="pagination-wrap"> <?php $crud->paginglink($query,$records_per_page); ?> </div> </td> </tr> Então com essas duas functions na lista de exibição, com uma consigo exibir todas linhas e com outra consigo deletar. ------------- Sobre o PDO::FETCH_ORI_LAST Só que desta vez, use mais uma constante chamada FETCH_ORI_LAST, com ela não é necessário percorrer o array, porque a função retorna um índice, dispensando o uso de foreach e while PDO::FETCH_ORI_LAST (integer) Buscar a última linha no conjunto de resultados. Válido somente para cursores de rolagem. Entendi que FETCH_ORI_LAST retorna um indice mas com o ponteiro no ultimo id da lista, seria isso? Inserindo os blocos try e catch fica assim (comentei o que entendi): public function getId($id) // pega id informado por exemplo no páginas.php { try { $stmt = $this->db->prepare("SELECT * FROM tbl_users WHERE id=:id"); //acessa o DB $stmt->bindParam(":id",$id, PDO::PARAM_INT); //verifica se o ID é do tipo inteiro $stmt->execute(); // executa o SELECT return $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_LAST); } catch(PDOException $e) { echo $e->getMessage(); return false; } } Mas não entendi como chamar esse id da function getId($id) no paginas.php já que não tem um id lá, como é o caso da function delete Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Agosto 19, 2015 Bom vamos lá, evite misturar htmls com códigos php, deixa este espaguete com o padrão estruturado. ^_^ De um return somente no array! ;) Na função getId, você usa quando quer que liste somente os dados relacionado a uma unica ID, onde o parâmetro é passado via ( GET/POST ). Compartilhar este post Link para o post Compartilhar em outros sites