1

私はPHPが初めてで、txtファイルから特定のテキストを解析してから、そのテキストをMySQLデータベースに挿入しようとしています。それでは、より具体的に説明しましょう。ファイルの形式はそのままで、ドキュメントの終わりまで繰り返されます。楕円は前のトーンと次のトーンを表します。

...

[Tone27]                            
Atone = 707.3                        
Btone = 746.8                        
Btonelength = 3                        
Btonedebounce = 1                    
Description = Fire Department 1                
mp3_Emails = email@address.com,email2@address.com,email3@address.com          
amr_Emails = email2@textmessaging.com,email1@textmessaging.com        
alert_command = c:\test.bat                
post_email_command = c:\test2.bat            
radio_frequency = 154.475    
exclude_from = 13:25                        
exclude_to = 13:35                        
exclude_emails = email2@textmessaging.com,email2@address.com

... 

私がやりたいことは、ファイルからの各「トーン ブロック」の最初の項目 (「[tone27]」など) を解析し、それをデータベースの新しい行の最初のフィールドに挿入することです。次に、各行の " = " の前にあるもの、たとえば "Atone" を評価し、その行の " = " の後にあるもの、たとえば "707.3" をその名前のフィールドに挿入する必要があります。したがって、この行はデータベースでは次のようになります。

$id | [tone27] | 707.3 |746.8 | 3 | 1 | Fire Department 1 |email1@x.com,email2@x.com,e...|...

等々...

文字列関数を実行することでそれぞれを分離することができましたが、各値を適切に挿入するループを設定する方法がわかりません。それらを分離するために使用したコードは次のとおりですが、実際にデータベースに取り込むのにはまったく役に立ちません。

$txt_file    = file_get_contents('config/tones.txt');
$rows        = explode("\n", $txt_file);
foreach($rows as $row => $data)
{   
$row_data = explode(' = ', $data);

if ((isset($row_data[0])) && ($row_data[0] !== " " )){
    $info[$row]['attribute'] = $row_data[0];
    $info_attribute = trim($info[$row]['attribute']);
}
if (isset($row_data[1])){
    $info[$row]['value']         = $row_data[1];
    $info_value = trim($info[$row]['value']);
    //display data
    echo 'Row ' . $row . ' Attribute: ' . $info_attribute . '<br />';
    echo 'Row ' . $row . ' Value: ' . $info_value . '<br />';
} elseif (($info[$row]['attribute']) && (!empty($info_attribute))) {
    echo "<br>";
    echo 'Row ' . $row . ' Attribute: ' . $info_attribute . '<br />';
    continue;
}      

私は初心者です、間違いありません。道に迷いました。よろしくお願いします!!!

****|| EDIT ||****

すばらしい回答をありがとうございます。これが私が結果的に思いついたものです。クエリはまだありません。CRUD の読み取り部分の単純なダッシュのみですが、コードは同じで、クエリのみが含まれます。すばらしい parse_ini_file() 関数を紹介してくれた @leepowers に感謝します。

foreach(parse_ini_file("config/tones.txt", true) as $k => $v){
extract($v, EXTR_SKIP);
echo "<br>";
echo $k . "<br>"; 
foreach($v as $sv => $ssv){ 

    $lcase_sv = strtolower($sv); 
    if (trim($lcase_sv) == 'amr_emails'){ 
        echo "sv: amr_Emails:<br>"; 
        echo "ssv:<br>";
        $eA = explode(',', trim($ssv));
        foreach($eA as $eK => $eV){ 
            echo "email" . filter_var($eK + 1, FILTER_SANITIZE_NUMBER_INT) . ": " . $eV . "<br>"; 
        }
    } elseif (trim($lcase_sv) == 'mp3_emails'){ 
        echo "ssv:<br>";
        $eA = explode(',', trim($ssv));
        foreach($eA as $eK => $eV){
            echo "email" . filter_var($eK + 1, FILTER_SANITIZE_NUMBER_INT) . ": " . $eV . "<br>";
        }
    }else {
        echo "sv: " . $sv .", " . "s: " . $ssv . "<br>"; 
    }
}

}

4

3 に答える 3

0

parse_ini_file($ソース); 連想配列を返す

$query = 'INSET INTO ... (key, value) VALUES (:key, :value)';
$stmt  = DB::prepare($query);

foreach( parse_ini_file($source) as $key => $value )
{
  $stmt->execute(array(':key' => $key, ':source' => $source));
}

この例ではPDOを使用しています

ループ内のファイルの出力は次のとおりです。

foreach( parse_ini_file($source) as $key => $value )
{
  echo $key; // Atone in first loop
  echo $value; //707.3 in first loop

  // BUT NOT USE THIS!!! use mysqli or PDO
  mysql_query("INSERT INTO ... (key, value) VALUES ($key, $value)");
}
于 2012-11-29T05:22:04.597 に答える
0

parse_ini_fileデータ構造を配列にロードするために使用します。

そこから、SQL ステートメントを作成して実行できます。

$entries = parse_ini_file("config/tones.txt", true);
foreach ($entries as $section => $fields) {
  extract($fields, EXTR_SKIP);
  $sql = "INSERT INTO mytable (section, atone, btone) VALUES ($section, '$Atone', '$Btone'";
   ....
}

もちろん、実行する前に SQL ステートメントを準備してエスケープする必要があります。

于 2012-11-29T05:23:12.493 に答える
0

別の方法を次に示します。必要に応じて変更する必要があります(行数/資格情報)。PDO を使用することをお勧めします。

$username = 'yourusername';
$password = 'yourpass';

try {
    $conn = new PDO('mysql:host=127.0.0.1;dbname=yourdbname', $username, $pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'successfully connected';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

foreach(parse_ini_file('yourfile.ini', true) as $row)
{
    try {
        // just adjust the number of columns accordingly
        $stmt = $conn->prepare('insert into tablename values(?,?,?,?,?,?,?,?,?,?,?,?,?)');
        // $row contains the values to insert
        $stmt->execute($row);
        echo 'rows affected' . $stmt->rowCount(); // 1      
    }catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
}
于 2012-11-29T08:44:50.290 に答える