Jump to content
PauloOliveira

PDO utf-8

Recommended Posts

PauloOliveira

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

Share this post


Link to post
Share on other sites
devgoncalo

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

Share this post


Link to post
Share on other sites
PauloOliveira

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

Share this post


Link to post
Share on other sites
devgoncalo

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

Share this post


Link to post
Share on other sites
13dev

Olá, experimenta mudar a collation da tua base de dados para 'utf8_unicode_ci'

Edited by 13dev

Share this post


Link to post
Share on other sites
13dev
5 horas atrás, HappyHippyHippo disse:

collation != collection

Editado

Edited by 13dev

Share this post


Link to post
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.