Jump to content

PDO utf-8


PauloOliveira

Recommended Posts

Olá a todos

Estou a tentar inserir dados na tabela, e tudo funciona perfeitamente, até que precisei de inserir caracteres especias!

bem aqui fica o codigo e o erro, o que estarei a fazer de errado?

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
	//$conn->exec("SET NAMES 'utf8';");
    $sql = "INSERT INTO epocas (alemao, frances, ingles)
    VALUES ('$alemao', '$frances', '$ingles')";
    
    $conn->exec($sql);
    echo "New record created successfully";
	//header('Location: inserirdados.php');
    }
catch(PDOException $e)
    {
     $conn . "<br>" . $e->getMessage();
    }

$conn = null;

O erro;

Recoverable fatal error: Object of class PDO could not be converted to string in C:\xampp\htdocs\Linguas\Backoffice\inserir_epoca.php on line 24

A linha 24 está bem no fundo do código:

 $conn . "<br>" . $e->getMessage();

Obrigado a todos

Link to comment
Share on other sites

olá,

o código da conexão à bd fica no inserir_epoca.php? não faz sentido.

e não podes fazer isto $conn . "<br>", $conn é um objecto e o php não converte para string automaticamente. para veres os dados de $conn podes fazer algo do género:

print_r("<pre>");
var_dump($conn);
print_r("</pre>");

assim de repente parece que estás a usar o método include para gerires o teu backoffice, sugiro que olhes para o metodo autoload através do composer https://getcomposer.org/.

em relação à própria conexão à bd, dá uma vista de olhos em:
 

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_EMULATE_PREPARES   => false

se a string que queres inserir não estiver em utf8 podes sempre converter, através de:

http://php.net/manual/en/function.utf8-encode.php

cumps

Link to comment
Share on other sites

Obrigado pela ajuda e sugestões :),sim fica no inserir_epoca.php, e percebo que diga que não faz sentido, mas no entanto é um projecto muito simples e pequeno, para exclusivamente uso próprio e como tal penso que deve ser irrelevante! 

Não estou a usar método include, isto é apenas um exemplo independente sem qualquer tipo de restrições tipo sessão se é a isso que te referes.

Bem, voltando ao erro, já experimentei outras soluções e segui a sugestão, mas no entanto nada mudou, continua sem inserir os caracteres especiais.

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname; charset=utf8", $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_EMULATE_PREPARES   => false));
	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $psql=$conn->prepare( "INSERT INTO epocas (alemao, frances, ingles)
    VALUES ('$alemao', '$frances', '$ingles')");
	//$ps=$conn->prepare($sql);
	$psql->bindParam('alemao',$alemao,PDO::PARAM_STR);
	$psql->bindParam('frances',$frances,PDO::PARAM_STR);
	$psql->bindParam('ingles',$ingles,PDO::PARAM_STR);
	$psql->execute();
   // $conn->exec($conn);
    echo "New record created successfully";
	//header('Location: inserirdados.php');
    }
catch(PDOException $e)
    {
     	print_r("<pre>");
		var_dump($conn);
		print_r("</pre>");	
    }

"se a string que queres inserir não estiver em utf8 podes sempre converter, através de:"  O que queres dizer? utf8 nao suporta todo o tipo de caracteres? Já gora a string que dá problemas é o " ' ".

Obrigado

Edited by PauloOliveira
Link to comment
Share on other sites

ola

Citação

e como tal penso que deve ser irrelevante

mas não devia, já que estás a despender tempo.

Citação

O que queres dizer? 

quero dizer que por vezes é usado outro tipo de encoding e para que tudo fique com utf8 é necessário converter.

http://php.net/manual/en/pdo.prepared-statements.php

documentação oficial:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

porque é que fazes ('$alemao', ?

já tentaste adicionar slashes?
 

$alemao = addslashes($alemao); // isto antes de inserires na bd claro

para casos mais complexos, podes sempre converter para json:

$alemao = json_encode($alemao);

mas vai-te prejudicar nas pesquisas.

cumps

Edited by devgoncalo
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.