$query = '
PREPARE statement FROM
"INSERT INTO games_new
(
gamedate,
hometeam,
visitors,
result,
matchreport,
battedfirst,
fieldedfirst,
battedfirstruns,
battedfirstextras,
battedfirsttotal,
battedsecond,
fieldedsecond,
battedsecondruns,
battedsecondextras,
battedsecondtotal
)
VALUES
(
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)
"';
$result = mysql_query($query);
if (!$result) {die("Database access failed: " . mysql_error());}
$query =
'SET @gamedate = $_POST["gamedate"],' .
'@hometeam = $_POST["hometeam"],' .
'@visitors = $_POST["visitors"],' .
'@result = $_POST["result"],' .
'@matchreport = $_POST["matchreport"],' .
'@battedfirst = $_POST["battedfirst"],' .
'@fieldedfirst = $_POST["fieldedfirst"],' .
'@battedfirstruns = $_POST["battedfirstruns"],' .
'@battedfirstextras = $_POST["battedfirstextras"],' .
'@battedfirsttotal = $_POST["battedfirsttotal"],' .
'@battedsecond = $_POST["battedsecond"],' .
'@fieldedsecond = $_POST["fieldedsecond"],' .
'@battedsecondruns = $_POST["battedsecondruns"],' .
'@battedsecondextras = $_POST["battedsecondextras"],' .
'@battedsecondtotal = $_POST["battedsecondtotal"]'
;
$result = mysql_query($query);
if (!$result) {die("Database access failed: " . mysql_error());}
$query = '
EXECUTE statement USING
@gamedate,
@hometeam,
@visitors,
@result,
@matchreport,
@battedfirst,
@fieldedfirst,
@battedfirstruns,
@battedfirstextras,
@battedfirsttotal,
@battedsecond,
@fieldedsecond,
@battedsecondruns,
@battedsecondextras,
@battedsecondtotal
';
$result = mysql_query($query);
if (!$result) {die("Database access failed: " . mysql_error());}
$query = 'DEALLOCATE PREPARE statement';
$result = mysql_query($query);
if (!$result) {die("Database access failed: " . mysql_error());}
我收到此语法错误:
数据库访问失败:您的SQL语法出错;校验 与您的MySQL服务器版本对应的手册 在'[“gamedate”]附近使用的语法,@ hometeam = $ _POST [“hometeam”],@ visitor = $ _POST [“访客”],@ resu'
有什么想法吗?感谢。
答案 0 :(得分:5)
首先,了解单('
)和双("
)quoted strings in php之间的区别。
其次,mysql_
函数aren't recommended将被再次使用。使用MySQLi或PDO。
所以你应该使用:
"SET @gamedate = '{$_POST['gamedate']}'"
而不是使用'
转义。或者更确切地说:
'SET @gamedate = "' . mysql_real_escape_string( $_POST['gamedate'], $conn) . '"'
或者你可以采用正确的方式(例如使用PDO::prepare
):
$sql = 'SET @gamedate = :gamedate';
$sth = $dbh->prepare($sql); // $dbh is instance of PDO
$sth->execute(array(':gamedate' => '...'));
答案 1 :(得分:4)
用于此用途:
mysqli_prepare ( $link , $query );
示例:
$mysqli = new mysqli("localhost", "user", "pwd", "db");
$stmt = mysqli_prepare($link, "INSERT INTO games_new
( gamedate, hometeam, visitors, result, matchreport, battedfirst, fieldedfirst, battedfirstruns, battedfirstextras, battedfirsttotal, battedsecond, fieldedsecond, battedsecondruns, battedsecondextras, battedsecondtotal )
VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
mysqli_stmt_bind_param($stmt, "ssssssssssssss",
$_POST["hometeam"],
$_POST["visitors"],
$_POST["result"],
$_POST["matchreport"],
$_POST["battedfirst"],
$_POST["fieldedfirst"],
$_POST["battedfirstruns"],
$_POST["battedfirstextras"],
$_POST["battedfirsttotal"],
$_POST["battedsecond"],
$_POST["fieldedsecond"],
$_POST["battedsecondruns"],
$_POST["battedsecondextras"],
$_POST["battedsecondtotal"]
);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
mysqli_close($link);
答案 2 :(得分:1)
$query =
'SET @gamedate = $_POST["gamedate"],' .
因为它是单引号,所以不评估$_POST["gamedate"]
。你应该这样做:
$query =
"SET @gamedate = {$_POST['gamedate']}," .
但是,直接使用$_POST
参数将最终通过SQL注入攻击您的网站。
答案 3 :(得分:-2)
'@battedsecond = $_POST["battedsecond"],'
由于您使用的是简单引号,因此无法将变量直接放入字符串中。要么使用双引号,要么使用连接。
"@battedsecond = {$_POST["battedsecond"]},"
//OR
'@battedsecond = '.$_POST["battedsecond"].','