Php PDO SQL插入语法问题
我试图让我的页面一次将多行插入数据库。所有信息都来自上一页。输入某个坐标后,该行不会保存 测试时,仅Alpha会获得一个与排除的坐标不同的坐标 运行代码时,出现以下错误:Php PDO SQL插入语法问题,php,mysql,pdo,Php,Mysql,Pdo,我试图让我的页面一次将多行插入数据库。所有信息都来自上一页。输入某个坐标后,该行不会保存 测试时,仅Alpha会获得一个与排除的坐标不同的坐标 运行代码时,出现以下错误: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for t
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 2
这是我的代码:
try {
$conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
$dag = mysqli_real_escape_string($conn, $_GET['dag']);
$tijd = mysqli_real_escape_string($conn, $_GET['tijd']);
$wgs_coordinaat_x_alpha = mysqli_real_escape_string($conn, $_GET["x_alpha"]);
$wgs_coordinaat_y_alpha = mysqli_real_escape_string($conn, $_GET["y_alpha"]);
$wgs_coordinaat_x_bravo = mysqli_real_escape_string($conn, $_GET["x_bravo"]);
$wgs_coordinaat_y_bravo = mysqli_real_escape_string($conn, $_GET["y_bravo"]);
$wgs_coordinaat_x_charlie = mysqli_real_escape_string($conn, $_GET["x_charlie"]);
$wgs_coordinaat_y_charlie = mysqli_real_escape_string($conn, $_GET["y_charlie"]);
$wgs_coordinaat_x_delta = mysqli_real_escape_string($conn, $_GET["x_delta"]);
$wgs_coordinaat_y_delta = mysqli_real_escape_string($conn, $_GET["y_delta"]);
$wgs_coordinaat_x_echo = mysqli_real_escape_string($conn, $_GET["x_echo"]);
$wgs_coordinaat_y_echo = mysqli_real_escape_string($conn, $_GET["y_echo"]);
$wgs_coordinaat_x_foxtrot = mysqli_real_escape_string($conn, $_GET["x_foxtrot"]);
$wgs_coordinaat_y_foxtrot = mysqli_real_escape_string($conn, $_GET["y_foxtrot"]);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// begin the transaction
$conn->beginTransaction();
// our SQL statements
if ($wgs_coordinaat_x_alpha == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Alpha', '$wgs_coordinaat_x_alpha', '$wgs_coordinaat_y_alpha')");
}
if ($wgs_coordinaat_x_bravo == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Bravo', '$wgs_coordinaat_x_bravo', '$wgs_coordinaat_y_bravo'))");
}
if ($wgs_coordinaat_x_charlie == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Charlie', '$wgs_coordinaat_x_charlie', '$wgs_coordinaat_y_charlie')");
}
if ($wgs_coordinaat_x_delta == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Delta', '$wgs_coordinaat_x_delta', '$wgs_coordinaat_y_delta')");
}
if ($wgs_coordinaat_x_echo == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Echo', '$wgs_coordinaat_x_echo', '$wgs_coordinaat_y_echo')");
}
if ($wgs_coordinaat_x_foxtrot == "47.9747674834") {}
else {
$conn->exec("INSERT INTO markers (id, type, dag, tijd, deelgebied, lat, lng)
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Foxtrot', '$wgs_coordinaat_x_foxtrot', '$wgs_coordinaat_y_foxtrot')");
}
// commit the transaction
$conn->commit();
echo "Hint succesvol toegevoegd!";
}
catch(PDOException $e)
{
// roll back the transaction if something failed
$conn->rollback();
echo "Opes! Iets is fout gegaan: " . $e->getMessage();
}
$conn = null;
我没有主意了。谢谢 此行中的双括号:
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Bravo', '$wgs_coordinaat_x_bravo', '$wgs_coordinaat_y_bravo'))");
线上的双闭合支架:
VALUES (NULL, 'Hint', '$dag', '$tijd', 'Bravo', '$wgs_coordinaat_x_bravo', '$wgs_coordinaat_y_bravo'))");
我将您的if语句切换为使用
=代码>这样我们就去掉了额外的else
语句。此外,由于所有语句中的CODRD(<代码> 47.9747674834)/代码>都相同,所以考虑将其缓存在变量中。正如其他人所陈述的,在插入Bravo坐标的行中,在SQL上有两个闭锁圆括号。
但我必须对其他一些与语法错误无关的最佳实践进行评论
您应该使用查询参数,而不是在SQL字符串中插入变量。这更简单、更安全,因为它可以帮助您避免像以前那样的语法错误
此外,还将mysqli函数与PDO混合使用
下面是我如何编写此代码:
try {
$conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (isset($_GET['dag']) {
$dag = $_GET['dag'];
} else {
die("dag is verplicht");
}
if (isset($_GET['tijd']) {
$tijd = $_GET['tijd'];
} else {
die("tijd is verplicht");
}
// begin the transaction
$conn->beginTransaction();
// our SQL statements
$stmt = $conn->prepare("INSERT INTO markers
SET type='Hint', dag=:dag, tijd=:tijd, deelgebied='Alpha', lat=:lat, lng=:lng");
foreach (['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'] as $coord) {
if (isset($_GET["x_$coord"]) && $_GET["x_$coord"] != "47.9747674834") {
$stmt->execute([
'dag'=>$dag,
'tijd'=>$tijd,
'lat'=>$_GET["x_$coord"],
'lng'=>$_GET["y_$coord"]
]);
}
}
// commit the transaction
$conn->commit();
echo "Hint succesvol toegevoegd!";
}
catch(PDOException $e)
{
// roll back the transaction if something failed
$conn->rollback();
echo "Opes! Iets is fout gegaan: " . $e->getMessage();
}
$conn = null;
此语句$conn->exec(“插入标记(id、类型、dag、tijd、deelgebied、lat、lng)值(NULL、'Hint'、'dag'、'tijd'、'Bravo'、'wgs_Coordinat_x_Bravo'、'wgs_Coordinat_y_Bravo')
看起来有一个额外的)
。谢谢你的建议。使用!=将使代码更高效,并将缓存放置在坐标上是有意义的。此解决方案有效吗?是的。主要问题是双括号。我完全专注于Alpha语句,我没有注意到我在代码后面的错误。如果你能投票并接受正确答案,那就太好了。
try {
$conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (isset($_GET['dag']) {
$dag = $_GET['dag'];
} else {
die("dag is verplicht");
}
if (isset($_GET['tijd']) {
$tijd = $_GET['tijd'];
} else {
die("tijd is verplicht");
}
// begin the transaction
$conn->beginTransaction();
// our SQL statements
$stmt = $conn->prepare("INSERT INTO markers
SET type='Hint', dag=:dag, tijd=:tijd, deelgebied='Alpha', lat=:lat, lng=:lng");
foreach (['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'] as $coord) {
if (isset($_GET["x_$coord"]) && $_GET["x_$coord"] != "47.9747674834") {
$stmt->execute([
'dag'=>$dag,
'tijd'=>$tijd,
'lat'=>$_GET["x_$coord"],
'lng'=>$_GET["y_$coord"]
]);
}
}
// commit the transaction
$conn->commit();
echo "Hint succesvol toegevoegd!";
}
catch(PDOException $e)
{
// roll back the transaction if something failed
$conn->rollback();
echo "Opes! Iets is fout gegaan: " . $e->getMessage();
}
$conn = null;