在MySQL中保存(使用JS请求)和读取(使用PHP)XML

时间:2015-06-04 16:44:15

标签: javascript php mysql xml

我试图将一些xml内容(我以纯文本形式接收)保存到我网站的数据库中。我读过有关保存XML内容的内容,有人建议将XML保存在文本字段(数据库)中并不是一个好主意,所以我决定在blob中进行。事情是我通过CORS这样做,通过这种方式javascript:

var formData = new FormData();
formData.append("name", 'myNewFile'); 

// THE XML CONTENT
var content = '<a id="a"><b id="b">hey!</b></a>'; 
var blob = new Blob([content], { type: "text/xml"});
formData.append("file", blob);

var request = new XMLHttpRequest();
request.open("POST", url);
request.onreadystatechange = function() {
    if(request.readyState == 4 && request.status == 200) {
        resultsContainer.innerHTML = (request.responseText );
    }
}
request.send(formData);

在服务器上,我将其存储为:

$name = $_POST['name'];
$file = $_POST['file'];

$sql = "INSERT INTO ProfileFiles (name, file)
VALUES ('$name', '$file')";

似乎工作,条目是在数据库中创建的,但我无法看到BLOB字段中的内容。所以,我试图从服务器上读取它,使用PHP,但我只是检索&#34; 0&#34;在文件字段中。

$sql = "SELECT datetime, name, file FROM ProfileFiles";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Timestamp: " . $row["datetime"]."<br>";
        echo "Name: " . $row["name"]. "<br>";
        echo "Content: " + $row["file"];
        echo "<br>----------<br>";
    }
}
else
{
    echo "Nothing";
}

我错过了什么?提前致谢!我从未使用PHP。

1 个答案:

答案 0 :(得分:1)

您在$_POST['file']中没有得到任何内容的原因是您将其作为文件发送。发布的文件位于超全局变量$_FILES而非$_POST中。 $_FILES['file']将包含一个数组

array('name' => '...', 'tmp_name' => '...', 'type' => '...', 'size' => '...');

内容将保存到名称存储在$_FILES['file']['tmp_name']

中的临时文件中

你知道,你真的误入歧途......你要做的是将XML数据作为POST变量而不是文件发送。执行此操作时,您可以将数据保存到数据库中,就像您尝试过一样,但是使用预处理语句,它会是这样的(假设您使用的是mysqli

$name = $_POST['name'];
$file = $_POST['file'];

$sql = "INSERT INTO ProfileFiles (name, file)
VALUES (?, ?)";
$stmt =  $mysqli->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param("ss", $name, $file);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();

使用预准备陈述的重点是:

如果文件包含',则查询中会出错。你的代码也很容易被sql注入。您需要转义查询中的字符串。

我自己从未使用过mysqli,而且我给的代码看起来有点笨拙,所以这里有另一种选择:

$sql = "INSERT INTO ProfileFiles (name, file)
VALUES ('". mysqli_real_escape_string($name)."', '".mysqli_real_escape_string($file) ."')";