2012-04-13 19 views
1

我想使用MySQL將xml文件加載到表列中。我如何使用INSERT語句而不是UPDATE語句來執行此操作?將XML添加到使用MySQL的列中LOAD_FILE()

此代碼執行INSERT以創建一個新行,獲取最後一個插入行的id,然後嘗試執行更新以加載xml文件。但它不會更新帶有xml信息的行。

我想知道如何解決把xml放在數據庫列中。我還想簡化代碼並在一個INSERT語句中執行LOAD_FILE。

MySQL數據庫表結構

Field   Datatype  Attributes   Extra 

userid  INT(6)   unsigned    auto_increment 
user_events LONGTEXT 

PHP代碼中添加XML文件

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 

$con = mysql_connect("hostname","adminuser","adminpassword"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("test_db", $con); 

$qinsert = "INSERT INTO load_xml (`user_events`) VALUES ('user events')"; 
$result_insert = mysql_query($qinsert); 

$qtext = "SELECT * FROM load_xml"; 
$result = mysql_query($qtext); 
$numrows = mysql_num_rows ($result); 

while ($row = mysql_fetch_row($result)) { 
    echo 'user id '.$row[0].' user_events '.$row[1].'<br/>'; 
} 

$insert_id = "SELECT LAST_INSERT_ID()"; 
$rin_id = mysql_query($insert_id); 
$row = mysql_fetch_row($rin_id); 
$userid = $row[0]; 
echo 'last added id '.$userid.'<br/>'; 

$update_xml = "UPDATE load_xml SET user_events=LOAD_FILE('my_events.xml') WHERE userid='$userid'"; 
$result_update = mysql_query($update_xml); 

$qtext = "SELECT * FROM load_xml"; 
$result = mysql_query($qtext); 
$numrows = mysql_num_rows ($result); 

echo $numrows.'<br/>'; 

while ($row = mysql_fetch_row($result)) { 

    echo 'user_id '.$row[0].' user_events '.$row[1].'<br/>'; 

} 

mysql_close($con); 

?> 

回答

0

只需添加文件中的原始插入。文件路徑是服務器上文件的路徑。用於連接的mysql用戶必須具有文件權限。它必須是完整的路徑。在Windows中,您需要使用正斜槓來代替反斜槓 -

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 

$con = mysql_connect("hostname","adminuser","adminpassword"); 
if (!$con) { 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db("test_db", $con); 

$qinsert = "INSERT INTO load_xml (`user_events`) VALUES (LOAD_FILE('/full/path/to/my_events.xml'))"; 
$result_insert = mysql_query($qinsert); 

$userid = mysql_insert_id(); 
echo 'last added id '.$userid.'<br/>'; 

$qtext = "SELECT * FROM load_xml"; 
$result = mysql_query($qtext); 
$numrows = mysql_num_rows ($result); 

while ($row = mysql_fetch_row($result)) { 
    echo 'user id '.$row[0].' user_events '.$row[1].'<br/>'; 
} 

mysql_close($con); 

?> 

UPDATE - 這裏是使用PDO prepared statementfile_get_contents()另一個版本 -

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 

$db = new PDO('mysql:dbname=test_db;host=hostname', 'adminuser', 'adminpassword'); 

$qinsert = "INSERT INTO load_xml (`user_events`) VALUES (?)"; 
$stmt = $db->prepare($qinsert); 

$stmt->execute(array(file_get_contents('my_events.xml'))); 

?> 
+0

所以我不應該假設的mysql_query看起來在當前目錄。有沒有在PHP的方式來確定當前目錄,並與它建立路徑? – user823527 2012-04-13 22:43:35

+0

LOAD_FILE是服務器端(mysql服務器)操作,需要能夠訪問該文件。您可以使用'$ path = dirname(__ FILE __);'獲取當前文件的路徑。使用'file_get_contents()'將數據加載到字符串中然後將其傳遞到查詢中可能會更好。我在我的回答中增加了另一個例子。 – nnichols 2012-04-13 22:58:19

+0

PDO準備聲明的方法工作得很好!謝謝。 – user823527 2012-04-14 01:47:40