我有这段代码:
<?php
$conn = mysqli_connect("localhost", $db['username'], $db['password'], "the_table");
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM xlsws_images";
if(!$result = $conn->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
$path = $row['image_path'];
echo $path;
}
?>
它按预期工作,直到它到达一行image_path
,其中包含双引号,例如product/1/1”-wood-wheel-casters-set-of-4.png
。
在这种情况下,它返回没有双引号的路径,如product/1/1-wood-wheel-casters-set-of-4.png
。
是什么让这些引号消失,我该如何避免?
答案 0 :(得分:6)
“......其中有双引号,例如product / 1/1”“
这是一个卷曲(智能)引用”
,应该更改为"
。 (如果您在问题中向我们展示的是数据库中实际的引号类型)。
这就是为什么它失败了,从一开始就被引入你的数据库。
您可以使用REPLACE
在表格中更改它们。 (甚至删除它们)。
理想情况下,你应该在它到达db之前解决这个问题。
str_replace()
可以(也)帮助你。修改强>
以下测试期间,echo'd product/1/1”-wood-wheel-casters-set-of-4.png
$result = $connection->query("SELECT * FROM table");
while($row = $result->fetch_object()){
echo $row->path_column;
}
因此,很难说是导致代码失败的原因。
您可以尝试的一些事情是:
$path = mysqli_real_escape_string($conn, $row['image_path']);
和
$path = htmlentities(stripslashes($row['image_path']));
使用示例 str_replace()
:
$str = "product/1/1”-wood-wheel-casters-set-of-4.png";
echo $newstring = str_replace("”", "", $str);
哪个产生了:
product/1/1-wood-wheel-casters-set-of-4.png
请参阅堆栈上的以下问答,以在上传文件期间替换字符(重命名):
旁注:这意味着用下划线替换空格,但你可以基于同样的逻辑。
还有一些可能有用的例子。
这摆脱了引用:
$result = $conn->query("SELECT * FROM table");
while($row = $result->fetch_object()){
$new = $row->path_column;
$newstring = str_replace("”", "", $new);
}
echo $newstring;
并将新更改的卷曲引号转换为常规引号:
$result = $conn->query("SELECT * FROM table");
while($row = $result->fetch_object()){
$new = $row->path_column;
$newstring = str_replace("”", "\"", $new);
}
echo $newstring;
哪一个产生product/1/1"-wood-wheel-casters-set-of-4.png
"
而不是智能引用”
。修改强>
事实证明,这是在设置连接之前传递UTF-8的问题。
OP:“太棒了!$conn->set_charset('utf8mb4');
工作。这就是我需要添加到上面的代码中。现在无缝地工作。谢谢! - Joshua Goossen”。
根据我对OP的评论:
“你也可以在查询之前尝试设置为UTF-8作为你的连接。看看堆栈上的这个Q&amp; A UTF-8 all the way through那里有几个答案。连接是{ {1}}作为示例,在打开数据库连接之前使用。“