2012-05-31 1 views
8

Ich hole Daten in Arabisch aus MySQL Tabellen mit MySQLi. Also in der Regel verwende ich dies in Verfahren Stil:Setzen Sie Zeichensatz mit MySQLi

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

Jetzt bin ich mit dem OOP-Stil so versuche ich zu sehen, ob es etwas gibt, könnte ich setzen, anstatt die oben?

Ich fand das nur in PHP-Handbuch, also habe ich es getan, aber was ist mit der Einstellung von Namen auf UTF8?

$mysqli->set_charset("utf8"); 
+0

Beachten Sie, dass 'mysqli_set_charset' auch in der prozeduralen Stil existiert - gibt es keine Unterschiede in den tatsächlichen Fähigkeiten oder das Verhalten der verfahrens- und OOP Stile für MySQLi verwenden. Beachten Sie auch, dass die Verwendung von 'SET NAMES' oder' SET CHARACTER SET' hier explizit falsch ist. immer lieber 'mysqli_set_charset' (oder dessen OOP-Äquivalent). –

+0

Mischen Sie 'mysql_ *' und 'mysqli_ *' Schnittstellen nicht. Einfach Sie _nicht_ die veraltete (und entfernt in PHP 5.7) verwenden 'mysql_ *' Funktionen. –

Antwort

9

Es ist das gleiche:

$ mysqli-> query ("NAMES 'utf8' SET");

Aus dem Handbuch:

Dies ist der bevorzugte Weg, um die charset zu ändern. Die Verwendung von mysqli :: query() zur Ausführung von SET NAMES .. wird nicht empfohlen.

$mysqli->set_charset("utf8"); ist gerade genug, lassen Sie den mysqli db-Treiber die Sache für Sie tun.

+0

So halte ich, was ich in PHP-Handbuch +, was Sie hier haben, oder man würde ausreichen? –

+2

Die Dokumentation sagt '... Verwenden von mysqli :: query() zum Ausführen von SET NAMES .. wird nicht empfohlen. Http://php.net/manual/de/mysqli.set-charset.php – sofl

+1

@sys_debug Es sieht aus So wie Sie SET NAMES 'utf8'' nicht brauchen, wird '$ mysqli-> set_charset (" utf8 ")' genug sein. – xdazz

-1
mysqli_query($conn,"SET NAMES 'latin5'");

$ conn = Verbindungszeichenfolge

+1

Obwohl dieser Code die Frage beantworten kann, in Bezug auf zusätzlichen Kontext Bereitstellung _why_ und/oder _how_ es beantwortet die Frage würde seine langfristige Wert deutlich verbessern. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

6

sollten Sie verwenden

$mysqli->set_charset("utf8"); 

Nicht Verwendung SET NAMES oder SET CHARACTER SET explizit als MySQLi verwenden., Und schon gar nicht beide wie die Verwendung Fragesteller hier war ursprünglich. Gründe dafür, dass dies eine schlechte Idee:

  • Aufruf SET CHARACTER SET utf8 nach SET NAMES utf8 eigentlich nur undoes some of the work that SET NAMES did.
  • Das Handbuch PHP explicitly warns us zu mysqli_set_charset zu verwenden, nicht SET NAMES:

    Dies ist die bevorzugte Art und Weise ist es, die charset zu ändern. Die Verwendung von mysqli_query(), um es zu setzen (wie SET NAMES utf8) wird nicht empfohlen. Weitere Informationen finden Sie im Abschnitt zu den MySQL-Zeichensatzkonzepten.

  • Unter der Haube mysqli_set_charsetjust a wrapper for mysql_set_character_set ist aus der MySQL C API (oder sein Äquivalent mysqlnd).Mit Blick auf den docs for that function, können wir den Unterschied zwischen ihm sehen und SET NAMES:

    Diese Funktion arbeitet wie die SET NAMES Aussage, sondern setzt auch der Wert von mysql->charset und beeinflusst somit den verwendeten Zeichensatz von mysql_real_escape_string()

    Mit anderen Worten, $mysqli->set_charset('foo') wird alles tun SET NAMES foo tut und auch sicherstellen, dass mysqli_real_escape_string respektiert die neue Codierung. Wenn Sie nur Codierungen wie Latin 1 und UTF 8 verwenden, die ASCII strikt erweitern (dh alle ASCII-Strings genau so kodieren, wie sie in ASCII codiert wären), dann wird die Verwendung von SET NAMES anstelle von set_charset nichts brechen. Wenn Sie jedoch ungewöhnlichere Codierungen wie GBK verwenden, könnten Sie am Ende Ihre Strings verstümmeln oder sogar SQL injection vulnerabilities that bypass mysqli_real_escape_string eingeben.

Es ist somit eine gute Praxis nur set_charset verwenden, nicht SET NAMES. Es gibt nichts, das SET NAMES tut, dass set_charset nicht tut, und set_charset vermeidet das Risiko von mysqli_real_escape_string Verhalten falsch (oder sogar unsicher).

1

Sie können dies verwenden. Seine wirklich schön für mysqli Zeichensatz

$dbhost  = "localhost"; 
$dbuser  = "root"; 
$dbpass  = "dbpass"; 
$dbname  = "dbname"; 

$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); 
mysqli_query($conn,"SET CHARACTER SET 'utf8'"); 
mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'"); 
+0

können Sie andere Antworten lesen, bevor Sie Ihre eigenen –

0

Aus verfahrenstechnischen Stil Liebhaber.

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 

/* change character set to utf8 */ 
mysqli_set_charset($conn,"utf8"); 
+0

schreiben Bitte verwenden Sie nicht sterben(), um Fehler zu melden. Siehe [Grundlagen der Fehlerberichterstattung] (https://phpdelusions.net/articles/error_reporting) –