3
I have a problem that is a mystery to me, in my lodging at locaweb
a website that was running normally yesterday morning to afternoon started to accuse me of a connection error, I have not yet contacted their support because this same error happened to 1 mês
back and asked for a restore
of the files and everything went back to work but without any further explanation from the company.
I wish I could understand what is happening, I already researched about the error and saw that it may be that the connection file is being declared 2 times, but as I said, the site was working, so I came here to expose my doubt.
My index page has this setting:
if(!isset($_SESSION)) {
session_start();
}
// Require da classe de conexão
include_once("_classes/conexao_pdo.class.php");
include_once("_classes/crud.dsc.class.php");
// Instancia Conexão PDO
$conexao = Conexao::getInstance();
$crud = Crud::getInstance($conexao);
The conexao_pdo.class.php call looks like this:
include_once('_connections/config_db.php'); class Conexao { /* * Atributo estático para instância do PDO */ private static $pdo; /* * Escondendo o construtor da classe */ private function __construct() { } /* * Método estático para retornar uma conexão válida * Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão */ public static function getInstance() { if (!isset(self::$pdo)) { try { $opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_PERSISTENT => TRUE); self::$pdo = new PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . "; charset=" . CHARSET . ";", USER, PASSWORD, $opcoes); } catch (PDOException $e) { print "Erro: " . $e->getMessage(); } } return self::$pdo; } }
My page config_db.php
is like this:
define('HOST', 'meu hosts'); define('USER', 'usuario'); define('PASSWORD', 'senha'); define('DBNAME', 'banco'); define('TYPEDB', 'mysql'); define('CHARSET', 'utf8');
The page crud.dsc.class.php
is like this:
class Crud { // Atributo para guardar uma conexão PDO private $pdo = null; // Atributo estático que contém uma instância da própria classe private static $crud = null; /* * Método privado construtor da classe * @param $conexao = Conexão PDO configurada * @param $tabela = Nome da tabela */ private function __construct($conexao) { if (!empty($conexao)): $this->pdo = $conexao; else: echo "Conexão inexistente!
"; exit(); endif; } /* * Método público estático que retorna uma instância da classe Crud * @param $conexao = Conexão PDO configurada * @param $tabela = Nome da tabela * @return Atributo contendo instância da classe Crud */ public static function getInstance($conexao) { // Verifica se existe uma instância da classe if (!isset(self::$crud)): try { self::$crud = new Crud($conexao); } catch (Exception $e) { echo "Erro " . $e->getMessage(); } endif; return self::$crud; } /* * Método privado para construção da instrução SQL de INSERT * @param $arrayDados = Array de dados contendo colunas e valores * @return String contendo instrução SQL */ private function buildInsert($tabela, $arrayDados) { // Inicializa variáveis $sql = ""; $campos = ""; $valores = ""; // Loop para montar a instrução com os campos e valores foreach ($arrayDados as $chave => $valor): $campos .= $chave . ', '; $valores .= '?, '; endforeach; // Retira vírgula do final da string $campos = (substr($campos, -2) == ', ') ? trim(substr($campos, 0, (strlen($campos) - 2))) : $campos; // Retira vírgula do final da string $valores = (substr($valores, -2) == ', ') ? trim(substr($valores, 0, (strlen($valores) - 2))) : $valores; // Concatena todas as variáveis e finaliza a instrução $sql .= "INSERT INTO " . $tabela . " (" . $campos . ")VALUES(" . $valores . ")"; // Retorna string com instrução SQL return trim($sql); } /* * Método privado para construção da instrução SQL de UPDATE * @param $arrayDados = Array de dados contendo colunas, operadores e valores * @param $arrayCondicao = Array de dados contendo colunas e valores para condição WHERE * @return String contendo instrução SQL */ private function buildUpdate($tabela, $arrayDados, $arrayCondicao) { // Inicializa variáveis $sql = ""; $valCampos = ""; $valCondicao = ""; // Loop para montar a instrução com os campos e valores foreach ($arrayDados as $chave => $valor): $valCampos .= $chave . '=?, '; endforeach; // Loop para montar a condição WHERE foreach ($arrayCondicao as $chave => $valor): $valCondicao .= $chave . '? AND '; endforeach; // Retira vírgula do final da string $valCampos = (substr($valCampos, -2) == ', ') ? trim(substr($valCampos, 0, (strlen($valCampos) - 2))) : $valCampos; // Retira vírgula do final da string $valCondicao = (substr($valCondicao, -4) == 'AND ') ? trim(substr($valCondicao, 0, (strlen($valCondicao) - 4))) : $valCondicao; // Concatena todas as variáveis e finaliza a instrução $sql .= "UPDATE " . $tabela . " SET " . $valCampos . " WHERE " . $valCondicao; // Retorna string com instrução SQL return trim($sql); } /* * Método privado para construção da instrução SQL de DELETE * @param $arrayCondicao = Array de dados contendo colunas, operadores e valores para condição WHERE * @return String contendo instrução SQL */ private function buildDelete($tabela, $arrayCondicao) { // Inicializa variáveis $sql = ""; $valCampos = ""; // Loop para montar a instrução com os campos e valores foreach ($arrayCondicao as $chave => $valor): $valCampos .= $chave . '? AND '; endforeach; // Retira a palavra AND do final da string $valCampos = (substr($valCampos, -4) == 'AND ') ? trim(substr($valCampos, 0, (strlen($valCampos) - 4))) : $valCampos; // Concatena todas as variáveis e finaliza a instrução $sql .= "DELETE FROM " . $tabela . " WHERE " . $valCampos; // Retorna string com instrução SQL return trim($sql); } /* * Método público para inserir os dados na tabela * @param $arrayDados = Array de dados contendo colunas e valores * @return Retorna resultado booleano da instrução SQL */ public function insert($tabela, $arrayDados) { try { // Atribui a instrução SQL construida no método $sql = $this->buildInsert($tabela, $arrayDados); // Passa a instrução para o PDO $stm = $this->pdo->prepare($sql); // Loop para passar os dados como parâmetro $cont = 1; foreach ($arrayDados as $valor): $stm->bindValue($cont, $valor); $cont++; endforeach; // Executa a instrução SQL e captura o retorno $retorno = $stm->execute(); return $retorno; } catch (PDOException $e) { echo "Erro: " . $e->getMessage(); } } /* * Método público para atualizar os dados na tabela * @param $arrayDados = Array de dados contendo colunas e valores * @param $arrayCondicao = Array de dados contendo colunas e valores para condição WHERE - Exemplo array('$id='=>1) * @return Retorna resultado booleano da instrução SQL */ public function update($tabela, $arrayDados, $arrayCondicao) { try { // Atribui a instrução SQL construida no método $sql = $this->buildUpdate($tabela, $arrayDados, $arrayCondicao); // Passa a instrução para o PDO $stm = $this->pdo->prepare($sql); // Loop para passar os dados como parâmetro $cont = 1; foreach ($arrayDados as $valor): $stm->bindValue($cont, $valor); $cont++; endforeach; // Loop para passar os dados como parâmetro cláusula WHERE foreach ($arrayCondicao as $valor): $stm->bindValue($cont, $valor); $cont++; endforeach; // Executa a instrução SQL e captura o retorno $retorno = $stm->execute(); return $retorno; } catch (PDOException $e) { echo "Erro: " . $e->getMessage(); } } /* * Método público para excluir os dados na tabela * @param $arrayCondicao = Array de dados contendo colunas e valores para condição WHERE - Exemplo array('$id='=>1) * @return Retorna resultado booleano da instrução SQL */ public function delete($tabela, $arrayCondicao) { try { // Atribui a instrução SQL construida no método $sql = $this->buildDelete($tabela, $arrayCondicao); // Passa a instrução para o PDO $stm = $this->pdo->prepare($sql); // Loop para passar os dados como parâmetro cláusula WHERE $cont = 1; foreach ($arrayCondicao as $valor): $stm->bindValue($cont, $valor); $cont++; endforeach; // Executa a instrução SQL e captura o retorno $retorno = $stm->execute(); return $retorno; } catch (PDOException $e) { echo "Erro: " . $e->getMessage(); } } /* * Método genérico para executar instruções de consulta independente do nome da tabela passada no _construct * @param $sql = Instrução SQL inteira contendo, nome das tabelas envolvidas, JOINS, WHERE, ORDER BY, GROUP BY e LIMIT * @param $arrayParam = Array contendo somente os parâmetros necessários para clásula WHERE * @param $fetchAll = Valor booleano com valor default TRUE indicando que serão retornadas várias linhas, FALSE retorna apenas a primeira linha * @return Retorna array de dados da consulta em forma de objetos */ public function getSQLGeneric($sql, $arrayParams = null, $fetchAll = TRUE) { try { // Passa a instrução para o PDO $stm = $this->pdo->prepare($sql); // Verifica se existem condições para carregar os parâmetros if (!empty($arrayParams)): // Loop para passar os dados como parâmetro cláusula WHERE $cont = 1; foreach ($arrayParams as $valor): $stm->bindValue($cont, $valor); $cont++; endforeach; endif; // Executa a instrução SQL $stm->execute(); // Verifica se é necessário retornar várias linhas if ($fetchAll): $dados = $stm->fetchAll(PDO::FETCH_OBJ); else: $dados = $stm->fetch(PDO::FETCH_OBJ); endif; return $dados; } catch (PDOException $e) { echo "Erro: " . $e->getMessage(); } } }
If anyone can help me understand, I’d appreciate.
The error can be seen here: Error while accessing the site
I remembered an important fact that had passed, I was with an error that left a blank at the top of my page and showed me this character: , I ran this script that I got right here:
<?php
// Tell me the root folder path.
// You can also try this one
// $HOME = $_SERVER["DOCUMENT_ROOT"];
// Or this
// dirname(__FILE__)
ini_set('max_execution_time', 300);
$HOME = dirname(__FILE__);
// Is this a Windows host ? If it is, change this line to $WIN = 1;
$WIN = 0;
// That's all I need
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF8 BOM FINDER and REMOVER</title>
<style>
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
</style>
</head>
<body>
<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
echo '</p>';
// Recursive finder
function RecursiveFolder($sHOME) {
global $BOMBED, $WIN;
$win32 = ($WIN == 1) ? "\\" : "/";
$folder = dir($sHOME);
$foundfolders = array();
while ($file = $folder->read()) {
if($file != "." and $file != "..") {
if(filetype($sHOME . $win32 . $file) == "dir"){
$foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
} else {
$content = file_get_contents($sHOME . $win32 . $file);
$BOM = SearchBOM($content);
if ($BOM) {
$BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
// Remove first three chars from the file
$content = substr($content,3);
// Write to file
file_put_contents($sHOME . $win32 . $file, $content);
}
}
}
}
$folder->close();
if(count($foundfolders) > 0) {
foreach ($foundfolders as $folder) {
RecursiveFolder($folder, $win32);
}
}
}
// Searching for BOM in files
function SearchBOM($string) {
if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
return false;
}
?>
</body>
</html>
And after that, this class redeclaration error message began to emerge.
When you wrote Restore you were thinking of this command
mysql -u root -p seu-database < seu-arquivo-dump
? Whereseu-database
is the file containing the database andseu-arquivo-dump
is the backup?– Augusto Vasques
Hello @Augustovasques, I requested a page Store by Ocaweb, the Store was made the application started working again and then started to accuse this error, I did not understand your question.
– adventistapr
I would like to know how the process of
restore
no prompt. But it seems that it was your support team who executed the action.– Augusto Vasques
On which page is the error reported? Is it in the index itself? It gives the line number?
– Hiago Souza
Hello @Hiagosouza, gives error already in the index, I put the site access link in the question.
– adventistapr
Basically the error says that the class is set two or more times, always says the file name or it can be an apache configuration that adds this connection file to each request, see for
auto prepend
.– rray
just for testing review this line 15 and tell me the result.
– Bulfaitelo
Hello @Bulfaitelo, forgive me for the delay, I was emphatic, but commenting the requested part is not possible, I posted the class in the question and it starts in the class Connected {
– adventistapr