我正在为我的移动应用程序编写API。当我在使用logout方法时,我看到了奇怪的MySQL错误:
“您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在第1行使用”1“附近的正确语法”
API请求: thapi.php?q = logout& user = 1& session = aaa
我尝试在SELECT语句中添加“,但它没有解决我的问题。
这是我的代码:
mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
mysql_select_db(DB_BASE);
$q = "SELECT * FROM `system_sesje` WHERE `sesjaid` = \"" + $_GET['session'] + "\" AND `user` = " + $_GET['user'];
$a = mysql_query($q);
echo mysql_error();
if(mysql_num_rows($a) == 0)
{
$returning = array('error' => 'Invalid session id');
echo json_encode($returning);
break;
}
我的表结构:
答案 0 :(得分:2)
pdo解决方案如下:
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_BASE;
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
$conn = new PDO( $dsn, DB_USERNAME, DB_PASSWORD, $opt );
$stmt = $conn->prepare("SELECT * FROM `system_sesje` WHERE `sesjaid` = ? AND `user` = ?");
$stmt->bindParam( 1, $_GET['session'], PDO::PARAM_STR );
$stmt->bindParam( 2, $_GET['user'], PDO::PARAM_INT );
$stmt->execute();
if( $stmt->rowCount() == 0 ) {
$returning = array('error' => 'Invalid session id');
echo json_encode($returning);
break;
}
答案 1 :(得分:1)
快速修复您的查询:
$sql = "SELECT *
FROM `system_sesje`
WHERE `sesjaid` = '{$_GET['session']}'
AND `user` = '{$_GET['user']}'";
为了您的安全,您必须转义所有输入值。
答案 2 :(得分:0)
尝试更改
"SELECT * FROM `system_sesje` WHERE `sesjaid` = \"" + $_GET['session'] + "\" AND `user` = " + $_GET['user'];"
到
'SELECT * FROM `system_sesje` WHERE `sesjaid` = \"' . $_GET['session'] . '\" AND `user` = "' . $_GET['user'] . '"';
看看会发生什么
答案 3 :(得分:0)
根据您的评论,我解决了这个问题。
我改变了:
$q = "SELECT * FROM `system_sesje` WHERE `sesjaid` = \"" + $_GET['session'] + "\" AND `user` = " + $_GET['user'];
到:
$q = "SELECT * FROM `system_sesje` WHERE `sesjaid` = \"".$y."\" AND `user` = ".$z;
现在一切正常。我还添加了针对SQL注入的保护:
$y = str_replace(' ', '', $_GET['session']);
$z = str_replace(' ', '', $_GET['user']);
非常感谢!
答案 4 :(得分:-1)
您可以尝试这样编写查询:
$sql = "SELECT * FROM system_sesje ";
$sql.= "WHERE sesjaid = '".$_GET['session']."' ";
$sql.= "AND user = '".$_GET['user']."'";
我这样写查询,以便其他人可以更轻松地获取它们。注意每行末尾的空格。