如何根据第一个过程的结果运行第二个cURL过程?

问题描述:

我正在使用curl运行SQL查询以便在数据库中创建表。这里是工作代码:如何根据第一个过程的结果运行第二个cURL过程?

// defines the post vars 
$apikey = $_POST['apikey']; 
$username = $_POST['username']; 
$tablename = $_POST['tablename']; 

//SQL create table statment 
$sql = "CREATE TABLE " . (string)$tablename . " (post_id integer, post_title text, post_content text, post_date date, post_type text, permalink_guid text);"; 
$sql2 = "SELECT cdb_cartodbfytable('" . (string)$tablename . "');"; 

// initializing curl 
$ch = curl_init("https://".$username.".cartodb.com/api/v2/sql"); 
$query = http_build_query(array('q'=>$sql,'api_key'=>$apikey)); 
$query2 = http_build_query(array('q'=>$sql2,'api_key'=>$apikey)); 

// configuring curl options 
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

//result 
$result_jsonstring = curl_exec($ch); 
$result = json_decode($result_jsonstring); 
echo(print_r($result)); 

有了这段代码,我可以得到一个两个成功的回应。如果表创建成功:

stdClass Object 
(
[rows] => Array 
    (
    ) 

[time] => 0.013 
[fields] => stdClass Object 
    (
    ) 

[total_rows] => 0 
) 
1 

如果表名在数据库中已存在,我得到这个:

stdClass Object 
(
[error] => Array 
    (
     [0] => relation "tablename" already exists 
    ) 

) 
1 

我也可以成功运行第二个查询替换curl_setopt($ch, CURLOPT_POSTFIELDS, $query);curl_setopt($ch, CURLOPT_POSTFIELDS, $query2);

我遇到的问题是如果第一个查询成功(创建表,但不存在时运行),则获取第二个查询以运行。这里是我试图实现这一点的代码:第二卷曲请求是不工作 1):

// defines the post vars 
$apikey = $_POST['apikey']; 
$username = $_POST['username']; 
$tablename = $_POST['tablename']; 

//SQL create table statment 
$sql = "CREATE TABLE " . (string)$tablename . " (post_id integer, post_title text, post_content text, post_date date, post_type text, permalink_guid text);"; 

// initializing curl 
$ch = curl_init("https://".$username.".cartodb.com/api/v2/sql"); 
$query = http_build_query(array('q'=>$sql,'api_key'=>$apikey)); 

// configuring curl options 
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

//result 
$result_jsonstring = curl_exec($ch); 

//close the curl session 
curl_close($ch); 

if (TRUE === $result_jsonstring) 
     echo "It was true!"; 
     echo(print_r($result_jsonstring)); 

     ch2 = curl_init("https://".$username.".cartodb.com/api/v2/sql"); 
     $sql2 = "SELECT cdb_cartodbfytable('" . (string)$tablename . "');"; 
     $query2 = http_build_query(array('q'=>$sql2,'api_key'=>$apikey)); 
     curl_setopt($ch, CURLOPT_POST, TRUE); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $query2); 
     //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

     $result_jsonstring2 = curl_exec($ch2); 

     echo(print_r($result_jsonstring2)); 

     curl_close($ch2); 

这里是我与此具有的问题。我收到一条消息,说我必须“提供一个SQL查询”,我不知道为什么。我确实得到了“这是真的!”声明然而。 2)我一直在回复结束时得到数字1。在最后的情况下,我得到两个(11)。

{"rows":[],"time":0.008,"fields":{},"total_rows":0}It was true!11{"error":["You must indicate a sql query"]}11 

只有成功创建表后,如何成功运行第二个卷曲过程?

+0

对不起,这个问题太长了,只是为了简洁。 :) –

+1

如果将cURL封装在函数/类 - >方法中,并且使其可重用,那么您将非常有用。它可以返回false或数组,然后您可以将您的下一个操作基于该响应。您可以使用相同的cURL函数在第一次成功时再次调用。它将帮助您保持一致的数据完整性。你会知道该函数会返回一个或另一个。只是一个建议。 – Rasclatt

+0

感谢您的建议。尽管(对此很新颖),但必须要Google。 –

将两个最后的curl_setop更改为使用$ ch2而不是$ ch。

+0

哈谢谢!我完全不能相信,就是这样。任何想法如何消除1我在响应结束时得到? –

+0

我的猜测是,1的来自你使用回声布尔值真正print_r返回后,它打印回应。因此,测试没有回声功能... – Pafjo

+0

你是对的,这是1的来源。虽然我认为echo是在响应中生成json代码输出,而这显然是从别的东西中派生出来的。我怎样才能防止出现? –