我开发了一个将变量打印到mysql数据库的函数。
它似乎工作得很好,除了在sql中记录值时会跳过第一个值。但是,所有3个都显示echo
命令。换句话说,值1 2和3使用echo打印 - 但只有2和3进入数据库!
$xml = simplexml_load_file($url);
$allcharacters = $xml->xpath('///result/rowset/row/@name');
foreach($allcharacters as $alts) {
$con=mysqli_connect("localhost","user","password","master");
$sql="INSERT INTO masterlist (charactername) VALUES ('$alts')";
mysqli_query($con,$sql);
echo "Found $alts<br />";
正在插入示例数据:
Found Tiamat's Shadow
Found Troyd23
Found Gore Innovater
Gore Innovater
有什么建议吗?
答案 0 :(得分:0)
当您将输入插入数据库时,您不会清理输入。
第一项'
中的Found Tiamat's Shadow
会破坏您的SQL查询,因此实际上无法插入;这可以通过你的问题确认“它将跳过第一个值”。
使用MySQLi,您有两种方法可以解决此问题。
首先,您可以使用mysqli_real_escape_string()
转义数据:
$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
$alts = mysqli_real_escape_string($con, $alts);
$sql="INSERT INTO masterlist (charactername) VALUES ('" . $alts . "')";
...
使用此功能,任何“不安全”字符在插入数据库时都会自动转义。
第二种方法是使用prepared statement。这将需要更多的代码,但是,这样做几乎可以保证你不会忘记偶然做到这一点。这是一个准备好的声明的样本:
$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
$stmt = mysqli_prepare($con, "INSERT INTO masterlist (charactername) VALUES ( ? )");
mysqli_stmt_bind_param($stmt, "s", $alts);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
...
此方法比以前更加健壮,因为它将根据列的数据类型转义数据。它可能比您的特定用例需要的多一点,但是习惯使用预准备语句从不会受到伤害=]