如何设置可以通过 JavaScript onclick 事件触发的 PHP Curl POST 请求?

Posted

技术标签:

【中文标题】如何设置可以通过 JavaScript onclick 事件触发的 PHP Curl POST 请求?【英文标题】:How to set up a PHP Curl POST request which can trigger via a JavaScript onclick event? 【发布时间】:2022-01-23 20:07:35 【问题描述】:

我想在 javascript 中跟踪表单上的提交按钮单击事件并将提交按钮单击事件发送到 curl php 端,并且 curl php 文件中的 url (https://trackcmp.net/event) 将发送我触发并存储到的事件数据库(ActiveCampaign)。

表单由 ActiveCampaign 创建并嵌入到 Wordpress 网站中。

下面是我制作的2个文件,第一个是ajax文件,第二个是PHP文件。

有人可以帮帮我吗?谢谢。

(function($)
$("_form_44__submit").on('click', function () 
    // fire the AJAX request on button click
    $.ajax(
       type: "POST",
       url: 'curl.php',
       dataType: 'json',
       headers: "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",,
       data: actid: "actid",
    key: "key",
    event: "Click_Submit_Button_Event",
    visit: ["email"]
 ,
    )
    .done(function (response) 
        console.log(response);
       // if you want to do something on success
    )
    .fail(function (xhr, status, error) 
        console.log('error');
       // if you want to do something on error
    );
  );
)
<?php


$actid = $_POST['actid'];
$key =  $_POST['key'];
$event =  $_POST['event'];
$visit =  $_POST['visit'];

$url = "https://trackcmp.net/event";

    $curl = curl_init(); //open connection /
    // changes the cURL session behavior with options POST
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POSTFIELDS, array(
        'actid' => $actid,
        'key' => $key,
        'event' => $event,
        'visit' => $visit,
));
    //execute
    $result = curl_exec($curl); //handle $curl_init
    if ($result !== false) 
        $result = json_decode($result);
        if ($result->success) 
            echo 'Success! ';
         else 
            echo 'Error! ';
        

        echo $result->message;
     else 
        echo 'cURL failed to run: ', curl_error($curl);
    


?>

【问题讨论】:

【参考方案1】:

我假设 PHP curl 适合你,并且你有数据来填充 ajax 帖子中的值,所以:

为了让数据到达以 $_POST 形式发布 PHP,您需要像这样发送它,例如 $.ajax 代码:

$.ajax(
    type: "post",
    url: "curl.php",
    data: "actid=actid&key=somekey&event=Click_Submit_Button_Event&visit=email@at.com",
    success: function (data) 
        console.log('Submission was successful.');
        console.log(data);
    ,
    error: function (data) 
        console.log('An error occurred.');
        console.log(data);
    ,
);

看看数据的构建方式:你当然可以这样做:"actid="+actid+"&amp;key="+key+ ... etc

这样您的 PHP 文件将能够读取表单数据。

如果你要打印你的 $_POST,它看起来像:

Array
(
    [actid] => actid
    [key] => somekey
    [event] => Click_Submit_Button_Event
    [visit] => email@at.com
)

编辑这是一个完整的版本,带有表单点击和输入:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<html>
    <body>
        <form id="contactForm1" action="curl.php" method="post">
            Actid <input type="text" name="actid" /><br>
            Key <input type="text" name="key" /><br>
            Event <input type="text" name="event" /><br>
            Visit <input type="text" name="visit" /><br>
            <input type="submit" />
            <!-- Form input fields here (do not forget your name attributes). -->
        </form>
    </body>
</html>



<script type="text/javascript">
    var frm = $('#contactForm1');

    frm.submit(function (e) 

        e.preventDefault();
        console.log(frm.serialize()); /*show the data being sent from the form*/
        $.ajax(
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) 
                console.log('Submission was successful.');
                console.log(data);
            ,
            error: function (data) 
                console.log('An error occurred.');
                console.log(data);
            ,
        );
    );
</script>

为你 PHP 我认为你误认为数组发送数据......你应该尝试这样的事情:curl.php: 发布数据将成为一个 json,我怀疑这是您需要发送到您的端点的内容......它看起来像这样:

"actid":"actid","key":"key","event":"Click_Submit_Button_Event","visit":"someEmail@at.com"

<?php
$post = json_encode($_POST);
print_r($post);

$url = "https://trackcmp.net/event";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = json_decode(curl_exec($ch),true);
if (curl_errno($ch)) 
    echo 'Error:' . curl_error($ch);

curl_close($ch);

echo '<pre>';
print_r($result);

【讨论】:

您好,非常感谢您的建议。你的建议非常好。但我有一些与我提出的问题有关的问题。实际上,我使用的表单嵌入在 Wordpress 网站 中。 表单类是“_form_44”。因此,我可以请您就如何触发嵌入在 Wordpress 中的表单提出建议吗?谢谢。 提交表单时是否到达了 PHP 文件?你在这个过程中处于什么阶段? 它适用于带有表单点击和输入部分的完整版本。但实际上,表单已经创建并在 Wordpress 网站内实现。但我不知道如何使用 ajax 调用来触发 Wordpress 中的表单。并在用户单击 php 文件 (trackcmp.net/event) 中的 url 时发送跟踪事件(提交)。你有什么解决办法吗?谢谢。

以上是关于如何设置可以通过 JavaScript onclick 事件触发的 PHP Curl POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将 require_once() 的范围显式设置为全局?

如何让 require_once 从上面的目录中获取文件?

如何知道是不是通过 require_once() 调用了 php 脚本? [复制]

警告:require_once():在 PHP 中依赖系统的时区设置错误是不安全的

从命令行测试 JavaScript 代码 [重复]

并发编程Once 基本用法和如何实现以及常见错误