【问题标题】:Calling a PHP API from HTML Form?从 HTML 表单调用 PHP API?
【发布时间】:2016-06-28 22:06:56
【问题描述】:

我开发 iOS 应用程序已有一段时间了,刚刚开始设计我的网站。在我的一个应用程序中,我使用以下方法将数据添加到我的数据库中:

let URL = NSURL(string: urlPath.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
let data = NSData(contentsOfURL: URL!)

var response = ""
if let data = data{
        response = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
}

urlPath 看起来像:http://mydomainname.com/folder/anotherFolder/theAPI.php?arg1=one&arg2=two&arg3=three 等等。

我真正想做的是使用所有参数调用 API.php 文件,其中每个参数(arg1=、arg2= 等)都是 HTML 表单中的一个字段。我找到了一些处理 HTML 表单和验证数据的教程,现在我的表单看起来像:

<form action="action.php" method="post">
        <div id="formtext">Name</div>
        <input type="text" name="Name">
        <div id="formtext"><br>Email Address:</div>
        <input type="text" name="Email"><br>
        <div id="formtext"><br>Password</div>
        <input type="text" name="Password"><br><br>
        <input type="submit" name="submit" value="Submit">
</form>

抱歉,如果 HTML 有点令人生畏,我没有足够的经验知道“整洁”/传统的 HTML 代码是什么样的,这是我从教程中设法拼凑起来的。 我还知道,在action.php 中,您可以获得以下形式的值:$_POST['Name']。我觉得我真的很接近 - 我只是找不到任何地方可以告诉我如何调用这个 api。

我能得到的最接近的是:

$name = $_POST['Name']
$email = $_POST['Email']
$password = $_POST['Password']
$response = file_get_contents('http://domain.com/folder/api.php?Name=' . $name . '&Email=' . $email . '&Password=' . $password);
echo $response

如果您是 php 专家,再次抱歉,您的代码被破坏了 :)

(哦,结果只是说 where 子句中的第 26 行有一个错误 - API 很好,因为我从我的应用程序中对其进行了测试)。 编辑:Where 子句曾经是 While 循环(对不起)

最后,如果有人告诉我在action.php 中输入的内容,我将不胜感激(不包括验证 - 我稍后会继续讨论),如果我做错了什么可笑的错误,请告诉我。

谢谢:)

【问题讨论】:

  • 除了不使用 ; 终止 PHP 行这里没有什么明显的错误。您可能需要对 $response 进行 urlencode。但不足以帮助我们发现您的语法错误。请发布更多代码,包括您提到的包含第 26 行的 while 循环。
  • echo $response 返回什么?
  • 您是想创建 action.php 作为 HTML 表单和现有 API 之间的中间,还是想从 HTML 页面调用现有 API?
  • @bitfiddler 对不起,我的意思是 While 子句(已编辑 Q),我发布的代码是 php 文件中的唯一代码。我只能假设 API 在为数据库记录生成 ID 时遇到问题(在对其中一个答案的评论中进一步解释)。

标签: php html forms api url


【解决方案1】:

首先,您需要将 PHP 指令放在 php 标记之间。

<?php
 //You php script here
?>

另外,php指令以“;”结尾,$response你做得很好。

<?php
$name = $_POST['Name'];
$email = $_POST['Email'];
$password = $_POST['Password'];
$response = file_get_contents('http://domain.com/folder/api.php?Name=' . $name . '&Email=' . $email . '&Password=' . $password);
echo $response;
?>

那么,直接使用表单中的数据并不是一个好主意。您应该先分析它们(确保您的电子邮件是真实的,而不是随机字符串等)。为此,您可以查看正则表达式:http://php.net/manual/en/function.preg-match.php

如果您需要更多信息,请告诉我。

【讨论】:

  • 谢谢,您的回答也很有帮助,因为它允许验证变量。一个问题:当我提交表单时,它会将我带到一个显示Cannot POST /action.php 的页面。我的 php 文件是否在错误的目录中?目前,出于测试目的,它所说的只是:&lt;?php echo 'Hello, World'; ?&gt;
【解决方案2】:

在 HTML 中,标签的 name="" 部分应与您的 arg1、arg2、arg3 相关联。我不知道您对 GET 和 POST 有多少经验,但是如果您希望 URL 包含示例中的所有参数,则应将表单方法设置为 get。 form 标记的 action 属性是您希望将值发送到的页面。为您的表单尝试以下操作:

<form action="http://mydomainname.com/folder/anotherFolder/theAPI.php" method="get">
        <div id="formtext">Name</div>
        <input type="text" name="arg1">
        <div id="formtext"><br>Email Address:</div>
        <input type="text" name="arg2"><br>
        <div id="formtext"><br>Password</div>
        <input type="text" name="arg3"><br><br>
        <input type="submit" name="submit" value="Submit">
</form>

提交此表单后,您应该被带到 URL http://mydomainname.com/folder/anotherFolder/theAPI.php?arg1=inputfromfirstbox&amp;arg2=inputfromfield2&amp;arg3=inputfromfield3

【讨论】:

  • 谢谢,这真的很有帮助。当我在我的项目中尝试您的代码时,提交表单会将我带到一个显示30Unknown column 'ID' in 'where clause' 的页面。由于我正在测试的 API 将新用​​户插入数据库,我只能假设“ID”是指在创建用户时由服务器自动生成的 UserID。不过,在从 iOS 调用 API 时,您不需要添加它。另外,在调用 API 之前,您将如何验证字段中的信息? EG 确保没有注射等。还是应该在 API 中完成?谢谢:)
  • 对于简单的表单验证,您可以只使用 HTML。例如,在您的电子邮件输入中,您可以在密码输入中使用type="email" 而不是文本和type="password"。这将阻止表单提交,直到该框包含 @ 符号并屏蔽密码。您在 HTML 或 Javascript 中进行的任何类型的验证都可以轻松绕过,因此如果您想要一些硬验证,您最好在 API.php 页面上的 PHP 中进行。至于你在API上遇到的错误,不看代码真的很难提供任何建议。
  • (续)从您提供的错误来看,您的数据库中似乎没有名为 ID 的列,但您正尝试在 API.php 的一个查询中使用它.它可能在 UPDATE 或 SELECT 语句中。
  • 感谢“输入”提示,这非常有帮助。我作为示例调用的 API 是add_user.php。当像/add_user.php?name=thename&amp;email=theemail&amp;pass=thepass 这样调用时,它会在名为users 的数据库表中添加一条记录,并在添加时自动生成userID。如果列是:ID | Name | Email | Password,那么对于上面的示例,行将是:42 | thename | theemail | thepass,假设它是第 42 个用户。未知 ID 是否有可能是那个 ID 列并且它不能生成?此外,HTML 表单是否会将空格编码为 %20s 和 @ 符号等?泰
  • 在不知道您的数据库结构和您正在使用的查询的情况下很难调试该问题,但是我相当确定它不在 INSERT 语句中(因为您不使用 WHERE 子句时仅在更新、选择或删除时插入)。是的,html 表单确实对空格和 @ 符号进行了编码,但是当您使用 $_GET$_REQUEST 超全局变量获取值时,PHP 会自动将它们转换回它们的等效字符。
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 2018-08-11
  • 2010-10-15
  • 2013-10-28
  • 1970-01-01
  • 2011-08-23
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多