1

latin1 でエンコードされ、latin1_swedish_ci で照合されたテーブルのデータを含む XML ファイルを別の mysql テーブルに転送したいと考えています。同じエンコーディングで宛先テーブルを設定しました。テーブルの各行についてデータベースにクエリを実行すると、すべての特殊文字が台無しになります。XML ファイルのエンコーディングも設定しました<?xml version="1.0" encoding="latin1" ?>。PHPの問題でしょうか?エンコーディングを別の場所に設定する必要がありますか:

これが私のスクリプトです:

    // create table courses if not exists
echo("Creating new tables...\n");
if (!mysql_query("CREATE TABLE IF NOT EXISTS members (
    id int(11) NOT NULL,
    isfg_no int(11) NOT NULL,
    lab_id int(11) NOT NULL,
    first varchar(256) NOT NULL,
    last varchar(512) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1"))
    die(mysql_error());

    // load xml file
echo "Loading XML file...\n";
$members = simplexml_load_file("members.xml");

foreach ($members as $row) {
    $id = mysql_real_escape_string($row->SO_IdSocio);
    $isfg_no = mysql_real_escape_string($row->SO_Numisfg);
    $lab_id = mysql_real_escape_string($row->SO_Numlab);
    $first = mysql_real_escape_string($row->SO_Nombre);
    $last = mysql_real_escape_string($row->SO_Apellidos);

    if (!mysql_query("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')")) 
        die(mysql_error());
}

XML の一部を次に示します。

<?xml version="1.0" encoding="latin1" ?>
<SOCIOS_INTRA>
<row>
    <SO_IdSocio>1</SO_IdSocio>
    <SO_Numsocio>001</SO_Numsocio>
    <SO_Numisfg>404</SO_Numisfg>
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab>
    <SO_Numlab>0</SO_Numlab>
    <SO_Nombre>******</SO_Nombre>
    <SO_Apellidos>*******</SO_Apellidos>
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion>
    <SO_Cp>28001</SO_Cp>
    <SO_Poblacion>Madrid</SO_Poblacion>
    <SO_Provincia>Madrid</SO_Provincia>
    <SO_Idpais>25</SO_Idpais>
    <SO_Email1>*******</SO_Email1>
    <SO_Email2></SO_Email2>
    <SO_Telefono>***</SO_Telefono>
    <SO_Fax>****</SO_Fax>
    <SO_Login></SO_Login>
    <SO_Password></SO_Password>
    <SO_Fecha>19960101</SO_Fecha>
    <SO_SituacionISFG>0</SO_SituacionISFG>
    <SO_SituacionGEP>1</SO_SituacionGEP>
    <SO_Observaciones></SO_Observaciones>
</row>
4

1 に答える 1

1

PHP でエンコーディングを設定する必要はありません。SET NAMES 'latin1'最初の SQL ステートメントとして使用する必要があります。

アップデート:

サーバーの設定が間違っていると思います。このコードを実行しましたが、すべてが完全に機能します

<?php

$lnk=mysql_connect('localhost', 'root', '');
mysql_select_db('test', $lnk);

echo("Creating new tables...\n");
if (!mysql_query("CREATE TABLE IF NOT EXISTS members (
    id int(11) NOT NULL,
    isfg_no int(11) NOT NULL,
    lab_id int(11) NOT NULL,
    first varchar(256) NOT NULL,
    last varchar(512) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1"))
    die(mysql_error());

    // load xml file
echo "Loading XML file...\n";
$members = simplexml_load_file("members.xml");

foreach ($members as $row) {
    $id = mysql_real_escape_string($row->SO_IdSocio);
    $isfg_no = mysql_real_escape_string($row->SO_Numisfg);
    $lab_id = mysql_real_escape_string($row->SO_Numlab);
    $first = mysql_real_escape_string($row->SO_Nombre);
    $last = mysql_real_escape_string($row->SO_Apellidos);

    if (!mysql_query("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')")) 
        die(mysql_error());
    else
        print("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')<br />");
}

?>

そしてこのXML

<?xml version="1.0" encoding="latin1" ?>
<SOCIOS_INTRA>
<row>
    <SO_IdSocio>2</SO_IdSocio>
    <SO_Numsocio>001</SO_Numsocio>
    <SO_Numisfg>404</SO_Numisfg>
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab>
    <SO_Numlab>0</SO_Numlab>
    <SO_Nombre>******</SO_Nombre>
    <SO_Apellidos>*******</SO_Apellidos>
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion>
    <SO_Cp>28001</SO_Cp>
    <SO_Poblacion>Madrid</SO_Poblacion>
    <SO_Provincia>Madrid</SO_Provincia>
    <SO_Idpais>25</SO_Idpais>
    <SO_Email1>*******</SO_Email1>
    <SO_Email2></SO_Email2>
    <SO_Telefono>***</SO_Telefono>
    <SO_Fax>****</SO_Fax>
    <SO_Login></SO_Login>
    <SO_Password></SO_Password>
    <SO_Fecha>19960101</SO_Fecha>
    <SO_SituacionISFG>0</SO_SituacionISFG>
    <SO_SituacionGEP>1</SO_SituacionGEP>
    <SO_Observaciones></SO_Observaciones>
</row><row>
    <SO_IdSocio>3</SO_IdSocio>
    <SO_Numsocio>001</SO_Numsocio>
    <SO_Numisfg>404</SO_Numisfg>
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab>
    <SO_Numlab>0</SO_Numlab>
    <SO_Nombre>******</SO_Nombre>
    <SO_Apellidos>*******</SO_Apellidos>
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion>
    <SO_Cp>28001</SO_Cp>
    <SO_Poblacion>Madrid</SO_Poblacion>
    <SO_Provincia>Madrid</SO_Provincia>
    <SO_Idpais>25</SO_Idpais>
    <SO_Email1>*******</SO_Email1>
    <SO_Email2></SO_Email2>
    <SO_Telefono>***</SO_Telefono>
    <SO_Fax>****</SO_Fax>
    <SO_Login></SO_Login>
    <SO_Password></SO_Password>
    <SO_Fecha>19960101</SO_Fecha>
    <SO_SituacionISFG>0</SO_SituacionISFG>
    <SO_SituacionGEP>1</SO_SituacionGEP>
    <SO_Observaciones></SO_Observaciones>
</row>
</SOCIOS_INTRA>
于 2012-09-10T18:13:08.430 に答える