向PHP传递数据的选项有哪些?

向PHP传递数据的选项有哪些?,php,ios,swift,filemaker,Php,Ios,Swift,Filemaker,凭借最少的“真实”编程经验,我正在从事一个项目,该项目将我已经构建的FileMaker Pro解决方案与使用FileMaker服务器的PHP API的本机iOS应用程序集成在一起。iOS应用程序是针对iPhone的,并且是用Swift编写的 我们正试图了解处理某些场景的最有效方法,特别是在将数据写回服务器时。让我们使用地址簿的简单示例。当用户导航到联系人记录时,他/她可以选择一个字段,编辑然后保存其内容 虽然我们已经实现了许多将数据写入服务器的函数,但它们都相对简单(比如扫描条形码、发送php请

凭借最少的“真实”编程经验,我正在从事一个项目,该项目将我已经构建的FileMaker Pro解决方案与使用FileMaker服务器的PHP API的本机iOS应用程序集成在一起。iOS应用程序是针对iPhone的,并且是用Swift编写的

我们正试图了解处理某些场景的最有效方法,特别是在将数据写回服务器时。让我们使用地址簿的简单示例。当用户导航到联系人记录时,他/她可以选择一个字段,编辑然后保存其内容

虽然我们已经实现了许多将数据写入服务器的函数,但它们都相对简单(比如扫描条形码、发送php请求以触发FM服务器中的脚本,然后将结果呈现给客户端)。对于包含多个字段的联系人记录,似乎通过标准的PHP URL将每个字段的值作为变量发送,其中一些字段可能是段落或照片,这既低效又笨重

对于那些不熟悉FileMaker PHP API的人,下面是一些示例代码,用于演示更新特定联系人记录的过程。示例代码执行以下操作:

  • 将从客户端传递的参数设置为变量
  • 定义应在其上执行代码的布局(FM PHP API适用于布局,而不是SQL之类的表)
  • 查找记录并更新字段
  • 示例代码:

    <?php
    require_once 'Filemaker.php';
    
    //connect to db
    $fm = new FileMaker();
    $fm->setProperty('database', 'fmDbName');
    $fm->setProperty('hostspec', '123.45.67.89');
    $fm->setProperty('username', 'user');
    $fm->setProperty('password', 'password');
    
    //define layout on which to process
    $layout = 'php_contacts';
    
    //define variables passed from client
    $contactId = $_GET['contactId'];
    $first = $_GET['firstName'];
    $last = $_GET['lastName'];
    $mobile = $_GET['mobile'];
    $office = $_GET['office'];
    $note = $_GET['note'];
    
    //Find the contact which is being updated
    $find = $fm->newFindCommand($layout);
    $find->addFindCriterion('contactId', $contactId);
    
    //execute the find
    $results = $find->execute();
    
    //check for error
    if (FileMaker::isError($result)) {
        echo "     Error: ".$results."     ";
        exit;
    }
    
    //declare the record being updated
    $record = $results->getFirstRecord();
    
    //update the fields
    $record->setField('firstName', $first);
    $record->setField('lastName', $last);
    $record->setField('mobile', $mobile);
    $record->setField('office', $office);
    $record->setField('note', $note);
    
    ?>
    
    
    
    我们面临的挑战不是如何实施特定的方法,而是首先要了解哪些选项以及与之相关的任何最佳实践

    例如,将变量作为数组或字典从客户端发送到PHP比将它们作为URL中的独立变量发送更好吗?将数据从本机应用程序中的多个字段整齐地推送到PHP服务器的其他选项有哪些


    谢谢

    我非常确定PHP基本上可以处理HTTP请求,这基本上就是POST和GET

    你发送的结构应该根据你的需要来定义,没有完美的解决方案

    您应该检查HTTP请求的工作方式:

    我很确定PHP基本上可以处理HTTP请求,这基本上就是POST和GET

    你发送的结构应该根据你的需要来定义,没有完美的解决方案

    您应该检查HTTP请求的工作方式:
    根据我的理解,
    $\u GET
    $\u POST
    慢得多。您应该从应用程序向服务器发送POST请求,该应用程序将传输字符串。通过互联网发送原始图像很容易导致失真和数据丢失。为了将图像作为字符串发送,您将使用Base-64编码。这意味着您将把图像二进制文件转换为返回字符串的编码方案。您可以将此字符串发送到服务器或应用程序进行解码。(注意:您可以使用Base-64编码的图像作为URL,这可能很方便。)

    我认为除了使用POST消息或原始JSON(如果可以的话),没有更好的方法在服务器和客户端之间发送数据。Swift和Objective-C有一个名为
    NSJSONSerialization
    的类,您可以使用它转换从PHP脚本返回的JSON,以便稍后在应用程序中使用

    从服务器上,您只需在脚本开头的变量中创建一个空数组供以后使用,然后在该数组可用时将信息附加到该数组中(如果您的服务器上有一个图像,您需要对其进行Base-64编码,然后仅在Base-64编码完成后将字符串附加到该数组中)。在脚本结束时——当您将所有要发送到应用程序的数据附加到该数组中时——您可以编写
    echo json\u encode($thatArray)
    将数组作为json发送回应用程序。当然,这意味着您从一开始就希望它是一个关联数组,因为您将拥有键和值对

    我将依靠该方法从服务器获取信息并将其翻转(在Swift应用程序中创建一个
    字典
    ,然后使用
    NSJSONSerialization.JSONObjectWithData(数据:NSData,选项:NSJSONReadingOptions,错误:NSErrorPointer)
    字典
    转换为JSON。然后创建一个请求,通过POST请求将JSON发送到服务器。当然,您的PHP脚本将使用
    JSON解码($\u POST['thatJSONFromTheApplication'])
    )让应用程序将JSON发送到服务器


    这就是我所做的,让我的应用程序和服务器一起工作。如果你读了这篇文章,你有一个更好的想法,请分享

    据我理解,
    $\u GET
    $\u POST
    慢得多。您应该从应用程序向服务器发送POST请求,该应用程序将传输字符串。通过互联网发送原始图像很容易导致失真和数据丢失。为了将图像作为字符串发送,您将使用Base-64编码。这意味着您将把图像二进制文件转换为返回字符串的编码方案。您可以将此字符串发送到服务器或应用程序进行解码。(注意:您可以使用Base-64编码的图像作为URL,这可能很方便。)

    我认为除了使用POST消息或原始JSON(如果可以的话),没有更好的方法在服务器和客户端之间发送数据。Swift和Objective-C有一个名为
    NSJSONSerialization
    的类,您可以使用它转换从PHP脚本返回的JSON,以便稍后在应用程序中使用

    从服务器上,您只需在脚本开头的变量中创建一个空数组供以后使用,然后在该数组可用时将信息附加到该数组中(如果您的服务器上有一个图像,您需要对其进行Base-64编码,然后仅在Base-64编码完成后将字符串附加到该数组中)
    /var/www/myapp/public/
    
    /var/www/myapp/config/
    
    // File config.php
    define('FM_DATABASE', 'fmdbname');
    define('FM_HOSTSPEC', '123.45.67.89');
    define('FM_USERNAME', 'user');
    define('FM_PASSWORD', 'password);
    
    $fm = new FileMaker(FM_DATABASE, FM_HOSTSPEC, FM_USERNAME, FM_PASSWORD);
    
    if($fm->isError($result)){ // this won't produce the deprecated warning.
        ...
    
    $editQuery = $fm->newEditCommand('my_layout', $recordId);
    $editQuery->setField('Status', $newStatus);
    $editResult = $editQuery->execute();