【问题标题】:Script is working in browser but not when requested by API脚本在浏览器中运行,但在 API 请求时无法运行
【发布时间】:2014-06-02 07:31:11
【问题描述】:

我有以下脚本:

<?php
require_once("config/db.php");

mysql_query("INSERT INTO SMS
(receiver, sender, message, date, reference)
VALUES
('".$_GET['receiver']."', '".$_GET['sender']."', '".$_GET['message']."', '".$_GET['date']."', '".$_GET['reference']."')")
or die(mysql_error());

?>

当我使用网络浏览器打开此页面时

import.php?receiver=316XXXXXXXX&sender=316XXXXXXXX&message=Wtf&date=1401700682&date_utc=1401693482&reference=4665583XX

信息已添加到我的数据库中。

但是,当 API 访问(并尝试发布到)页面时,什么都不会发生。但是,在我的 Apache 访问日志中,访问是存在的:

212.61.XXX.XXX - - [02/Jun/2014:09:18:02 +0200] "GET /import.php?receiver=3164XXXXXXXX&sender=316XXXXXXXX&message=Wtf&date=1401700682&date_utc=1401693482&reference=4665583XX HTTP/1.1" 200 44 "-" "-"

我不知道发生了什么。对此有什么想法吗?

【问题讨论】:

标签: php mysql apache api get


【解决方案1】:

所以尝试转义您的参数,我怀疑您要插入的消息包含',甚至知道您正在编辑它。

<?php
require_once("config/db.php");

mysql_query("INSERT INTO SMS (receiver, sender, message, date, reference)
                VALUES('".mysql_real_escape_string($_GET['receiver'])."', 
                        '".mysql_real_escape_string($_GET['sender'])."', 
                        '".mysql_real_escape_string($_GET['message'])."', 
                        '".mysql_real_escape_string($_GET['date'])."', 
                        '".mysql_real_escape_string($_GET['reference'])."')") 
            or die(mysql_error());
?>

但是在您编写更多代码之前,您应该使用mysqliPDOprepared query's,这是您移植到PDO 的代码(看看它有多干净,并且您可以免于SQL 注入[意外与否] ]):

<?php 
$host = "127.0.0.1";
$dbname = "da_database";
$user = "username";
$pass = "password";

try {
    $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass, array(
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
    );

} catch(PDOException $e) {
    //you could mail() this
    die('<pre>'.$e->getMessage().'</pre>');
}

try{
    $sql = $pdo->prepare("
    INSERT INTO SMS (receiver, sender, message, date, reference)
                VALUES(?, ?, ?, ?, ?)");

    $sql->bindValue(1, $_GET['receiver']);
    $sql->bindValue(2, $_GET['sender']);
    $sql->bindValue(3, $_GET['message']);
    $sql->bindValue(4, $_GET['date']);
    $sql->bindValue(5, $_GET['reference']);

    $sql->execute();
} catch(PDOException $e){
    //you could mail() this
    die('<pre>'.$e->getMessage().'</pre>');
}
?>

希望对你有帮助。

【讨论】:

  • 非常感谢您的回答。稍后我会看看 MySQLi 和 PDO。但是,目前,该脚本正在运行(在我的浏览器中)。当我从浏览器中的 Apache 访问日志(如上所示)复制请求时,它会将信息添加到数据库中。此外,正如您在日志中看到的那样,GET 请求中没有像 ' 这样的字符。问题是当 API 请求页面时没有任何反应。
  • 很奇怪,因为这很可能是问题所在,您是否使用 curl 获取 API?它返回什么,如果它是 INSERT 查询的问题,那么它将返回 mysql_error(),你是否有任何 SQL 限制或为列设置数据类型,例如它们都是 varchar()。还要检查您的 error.log 以获取线索。
【解决方案2】:

问题是在页面上执行的 IP 检查。我的 IP 被列入白名单,API 的 IP 没有。愚蠢的错误。

感谢所有答案以及改进我的代码的方法。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2019-05-24
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多