Bruno Augusto 417 Denunciar post Postado Fevereiro 20, 2013 Só isso mesmo? Eu nunca usei a MySQLi então não conheço a sintaxe o suficiente para dizer se são correspondências gêmeas... Mas isso é um excelente exemplo de quando eu falo que não tem graça brincar com o Evandro. :lol: Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Fevereiro 21, 2013 Não são correspondências gêmeas não. Na maioria dos mysqli_* pra frente, você precisará passar, como primeiro argumento, a conexão que será iterada. Fica $conn = mysqli_connect(); $result = mysqli_query($conn, 'show databases') or die(mysqli_error($conn)); Aí existem duas alternativas: 1. Utilizar a ferramenta de refatoração do IDE 2. Ler os erros na tela e corrigir conforme aparecerem Se for pra continuar se atendo à linha de comando, dá pra verificar os erros que a 'conversão' anterior gerou com o próprio php find . -type f -iname *.php -exec php -l {} | grep 'mysqli_' \; Ou, tentar algo um pouco mais highlander find . -type f -iname *.php -exec sed -ir 's:mysqli_([^c][^o].*\?)\(:mysqli_$1($conn, :' \; Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Fevereiro 21, 2013 É muito estranho usar assim, sei lá, não gosto .. Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 21, 2013 bom arranquei tudo o código que tinha da paginagão ja que não tava funcionando mesmo... :( só que agora ta me retornando os seguinte erros ae em baixo. <?php require_once("config.php"); $query_str = $driver->fetchAll("SELECT * FROM teste WHERE ID_PASTA = 0"); $query = mysqli_query($query_str); ----> linha 95 $x = 1; foreach ($result as $result){ -----> linha 99 echo "<div class='thumb'><a class='OBRA_".$x."' href='javascript:void(0);' onclick=\"javascript:exibeImagens(".$result['ID'].",".$x.");\"><img src='thumb.php?img=imagens/obras/".$result['IMAGEM']."' /></a></div>"; $x++; }; ?> ta me retornando os seguintes erros: Warning: mysqli_query() expects at least 2 parameters, 1 given in D:\WebServer\popbox.php on line 95Notice: Undefined variable: result in D:\WebServer\popbox.php on line 99Warning: Invalid argument supplied for foreach() in D:\WebServer\popbox.php on line 99 Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 21, 2013 Leia os erros, e tiver dificuldades em interpretar, traduza com algum tradutor online. O primeiro erro mostra que você não está cumprindo os requerimentos de invocação da função. A MySQLi, ao que parece, diferente da MySQL antiga precisa que a variável com o link de conexão seja passado sempre. O Segundo mostra que você está usando uma variável a qual não foi definida, o que é o BÁSICO da programação. O terceiro é apenas conseqüência do segundo. foreach espera uma variável de algo iterável e recebe um NULL, resultado de uma variável indefinida. Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 21, 2013 Leia os erros, e tiver dificuldades em interpretar, traduza com algum tradutor online. O primeiro erro mostra que você não está cumprindo os requerimentos de invocação da função. A MySQLi, ao que parece, diferente da MySQL antiga precisa que a variável com o link de conexão seja passado sempre. O Segundo mostra que você está usando uma variável a qual não foi definida, o que é o BÁSICO da programação. O terceiro é apenas conseqüência do segundo. foreach espera uma variável de algo iterável e recebe um NULL, resultado de uma variável indefinida. então pesquisei sobre os erros e "arrumei" assim, gostaria de saber está correto. não apresento erro mas não sei se ta certo tbm, pois não manjo nada... ;( só sou curioso. <?php require_once("config.php"); $mostrar_c = $driver->fetchAll("SELECT * FROM teste WHERE ID_PASTA = 0"); $consultar = mysqli_query($conn, '$mostrar_c'); $x = 1; foreach ($mostrar_c as $mostrar_c){ echo "<div class='thumb'><a class='OBRA_".$x."' href='javascript:void(0);' onclick=\"javascript:exibeImagens(".$mostrar_c['ID'].",".$x.");\"><img src='thumb.php?img=imgs/".$mostrar_c['IMAGEM']."' /></a></div>"; $x++; }; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 21, 2013 Quem vai dizer se está certo ou não é você. Se não mostrar erro é um bom ou mau sinal. Mau porque pode indicar que seus alertas de erro estão desativados ou muito baixos, mas como os outros erros foram mostrados, então pode se bom pois significa que tudo está ocorrendo sintaticamente bem. Agora o script faz aquilo que você tinha em mente quando o escreveu? Me parece que o objetivo dele é mostrar miniaturas de uma pasta. Ele faz isso? Se sim, ótimo. Se não (que é o que acho), bem... Agora, na minha perspectiva, misturar HTML é PHP está errado. Mas não vou entrar nesse mérito Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 21, 2013 - é mostrar miniaturas das pastas sim... - e até o momento ta fazendo que quero tbm... ;) - não entendi o que você quis dizer em misturar html com php ? e só mais uma duvida que nem no caso dessa conexão... <?php class Db_Driver { protected $connector; public function __construct(MySQLi $conexao) { $this->connector = $conexao; } public function __destruct() { if($this->isConnected()) { $this->connector->close(); $this->connector = null; } } public function getConnector() { return $this->connector; } public function isConnected() { return $this->getConnector() instanceof MySQLi; } public function query($sql) { $result = $this->getConnector()->query($sql); if(!$result) { $errno = $this->getConnector()->errno; $error = $this->getConnector()->error; throw new Exception( sprintf('Erro SQL #%s: %s', $errno, $error) ); } return $result; } public function fetch($sql) { $result = $this->query($sql); return $result->fetch_assoc(); } public function fetchAll($sql) { $data = array(); $result = $this->query($sql); while($cursor = $result->fetch_assoc()) { $data[] = $cursor; } return $data; } public function lastId() { return $this->getConnector()->insert_id; } } ?> como que faço pra usar ela nesse "script" que to usando ae que passei. tipo pra mim desconectar ou ele desconecta sozinho ?, ou essa query($sql) e essa fetchAll($sql) tbm, tipo usar essas funcões no script... ? Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Fevereiro 21, 2013 Ele desconecta sozinho, cada objeto tem uma conexão. Misturar HTML com PHP é uma péssima prática. Separe as camadas! Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 21, 2013 como assim ? :( pode me dar um exemplo por favor ? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 21, 2013 Me sinto até mal em dizer isso mas é melhor uma verdade dolorosa que uma mentira agradável.Com os problemas que você teve até o momento, MVC, que é a arquitetura de camadas mais conhecida (embora não a melhor) não seria uma mudança drástica demais pra você?.Seria como dar um jetpack pro seu cérebro fugir da sua cabeça: Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 21, 2013 fmz... da nada não. valeu mesmo assim. Compartilhar este post Link para o post Compartilhar em outros sites
Henrique Barcelos 290 Denunciar post Postado Fevereiro 22, 2013 Sugiro que vc mantenha exatamente o código que está no artigo e tente rodar os exemplos que estão no artigo. Faça isso localmente ou em um servidor com versão >= 5.0 que funciona perfeitamente. O código foi testado antes de ser postado. Depois disso, aí tente fazer uma adaptação se precisar, mas da forma como está, lhe permite fazer todas as operações básicas sobre o MySQL. Quanto ao que falaram aí do defaultConnector, bastar ler o artigo todo para entender o pq dele existir. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Fevereiro 22, 2013 Sugiro que vc mantenha exatamente o código que está no artigo e tente rodar os exemplos que estão no artigo. Faça isso localmente ou em um servidor com versão >= 5.0 que funciona perfeitamente. O código foi testado antes de ser postado. Depois disso, aí tente fazer uma adaptação se precisar, mas da forma como está, lhe permite fazer todas as operações básicas sobre o MySQL. Quanto ao que falaram aí do defaultConnector, bastar ler o artigo todo para entender o pq dele existir. Está errado ele existir, o semântico é um objeto representar uma conexão. Não um objeto poder mudar de conexão, isso gera múltiplas responsabilidade e estado global. Compartilhar este post Link para o post Compartilhar em outros sites
Henrique Barcelos 290 Denunciar post Postado Fevereiro 22, 2013 Múltiplas responsabilidades? A responsabilidade é uma só: fornecer uma interface para se conectar com o banco de dados. A diferença é que é permitido alterar qual banco de dados será acessado, sem a necessidade de criar outro objeto. defaultConnector só existe com o intuito de facilitar na criação de objetos Db_Driver. Normalmente, quando há múltiplos bancos de dados sendo consultados, algum deles será o mais acessado. Ao invés de passá-lo como parâmetro do construtor a cada vez que quisermos realizar operações sobre o banco de dados, se define uma instância estática padrão que será utilizada caso se utilize o construtor sem argumentos. Ao invés de fazer: $driver = new Db_Driver(new MySQLi('host', 'user', 'password', 'database')); // Em outra parte do código, em outro escopo: $anotherDriver = new Db_Driver(new MySQLi('host', 'user', 'password', 'database')); É possível fazer: // Arquivo de inicialização... Db_Driver::setDefaultConnector(new MySQLi('host', 'user', 'password', 'database')); // Em algum lugar do código: $driver = new Db_Driver(); // Em outro lugar do código: $anotherDriver = new Db_Driver(); Apesar de alguns puristas considerarem o uso de métodos e propriedades estáticas anti-OO, se usados corretamente podem facilitar um pouco a vida do programador :thumbsup: . Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 22, 2013 Mas Henrique, eu sei usar esse tipo de recurso, você sabe usar e pelo que vi até aqui o Enrico também deve saber. Mas o que dizer do cara que programa na base do Ctrl+C, Ctrl+V? Há uma boa chance dele não usar esse recuro, pelo menos não como deveria ou pior, tentar usar sem querer e se perder no meio do fluxo achando que está sob um banco quando se está por outro? Para evitar esse tipo de problema é que o Registry pode ser uma alternativa mais concisa. A propósito, não faltou alguma coisa nesse segundo CODE não? Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Fevereiro 22, 2013 bom vcs deve ter notado que to tendo enorme dificuldade em adaptar o msql_* para msqli... :( e agora me deparei com mais um erro que sinceramente não to conseguindo resolver, pesquisei no google sobre só que achei coisas falando sobre o PDO não sei se é igual... :( o que acontece é o seguinte quando clico no link/"imagem" ele deveria chamar as imagens de dentro da pasta referente ao link clicado mas quando clico ele me retorna o seguinte erro: <br /> <b>Notice</b>: Undefined variable: driver in <b>D:\WebServer\thumb_ajax.php</b> on line <b>4</b><br /> <br /> <b>Fatal error</b>: Call to a member function fetchAll() on a non-object in <b>D:\WebServer\thumb_ajax.php</b> on line <b>4</b><br /> thumb_ajax.php <?php $id_pasta = isset($_GET['PASTA'])?$_GET['PASTA']:0; $mostrar_c = $driver->fetchAll("SELECT * FROM teste WHERE ID_PASTA = ".$id_pasta); $consultar = mysqli_query($conn , '$mostrar_c'); $mostrar_c_pasta = $driver->fetchAll("SELECT * FROM teste WHERE ID = ".$id_pasta); $consultar_pasta = mysqli_query($conn , '$mostrar_c'); if($query_array_pasta = mysqli_fetch_array($consultar_pasta)){ $cidade = $query_array_pasta['CIDADE']; $estado = $query_array_pasta['ESTADO']; $bairro = $query_array_pasta['BAIRRO']; $status = $query_array_pasta['STATUS']; } $url_valor = ""; foreach ($mostrar_c as $mostrar_c){ $url_valor .= "{href : 'http://localhost/img/PASTA_".$id_pasta."/".$mostrar_c['IMAGEM']."', title: '".$bairro." - ".$cidade."/".$estado."'},"; } echo "[".$url_valor."]"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
angelorubin 142 Denunciar post Postado Fevereiro 22, 2013 Bom dia, Segundo o manual do PHP (Tradução Livre): "PDO fornece uma camada de abstração de acesso a dados, o que significa que, independentemente de qual banco de dados você está usando, você usa as mesmas funções para emitir consultas e buscar dados." Exemplo de Uso <?php $pdo = new PDO('sqlite:users.db'); $stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); $stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Higienizado automaticamente sanitized pela PDO $stmt->execute(); ?> Fonte - http://br.phptherightway.com/ Espero que ajude. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Fevereiro 22, 2013 Para evitar esse tipo de problema é que o Registry pode ser uma alternativa mais concisa. Registry não é nada bom, estado global é ruim sem exceção, usamos isso quando não sabemos controlar instâncias. Ao invés de fazer: $driver = new Db_Driver(new MySQLi('host', 'user', 'password', 'database')); // Em outra parte do código, em outro escopo: $anotherDriver = new Db_Driver(new MySQLi('host', 'user', 'password', 'database')); É possível fazer: // Arquivo de inicialização... Db_Driver::setDefaultConnector(new MySQLi('host', 'user', 'password', 'database')); // Em algum lugar do código: $driver = new Db_Driver(); // Em outro lugar do código: $anotherDriver = new Db_Driver(); Apesar de alguns puristas considerarem o uso de métodos e propriedades estáticas anti-OO, se usados corretamente podem facilitar um pouco a vida do programador :thumbsup: . Outra parte do código, injete o Db_Driver, não acesse nunca, tenha uma camada de serviços com um Container, veja como isso é ruim: <?php class UserAccess { public function __construct(Db_Driver $driver) { // .. // eu posso mudar a conexão, isso mata esse "defaultDriver", eu tenho controle sobre o que não deveria ter. Se eu usar um objeto representando uma conexão isso não seria problema, eu não conheceria a conexão e nem mesmo poderia mudá-la. } } // Para usar $driver = new Db_Driver(new Mysqli(etc)); $access = new UserAccess($driver); Bom dia, Segundo o manual do PHP (Tradução Livre): "PDO fornece uma camada de abstração de acesso a dados, o que significa que, independentemente de qual banco de dados você está usando, você usa as mesmas funções para emitir consultas e buscar dados." Exemplo de Uso <?php $pdo = new PDO('sqlite:users.db'); $stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); $stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Higienizado automaticamente sanitized pela PDO $stmt->execute(); ?> Fonte - http://br.phptherightway.com/ Espero que ajude. Ele não abstrai as queries nem algumas diferenças entre DBs, vc precisa ainda de uma camada de Db para abstrair queries e coisas específicas. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Fevereiro 22, 2013 E existe uma terceira alternativa? Compartilhar este post Link para o post Compartilhar em outros sites