我在一个网站上使用WebIM进行聊天支持。我希望能够设置一个计时器,用于当客户发起聊天会话时,如果操作员/技术人员在'x‘秒内没有响应,我希望页面重定向到另一个页面,客户可以在那里留言。
一种“请稍等,我们正在尝试为您接通”之类的事情。这样,如果所有的技术人员都太忙或正在帮助其他客户,等待的客户可以稍后再试或留言(就像聊天离线时一样)。
我仔细查看了聊天脚本的创建者mibew.org,没有任何关于这个功能的东西,而且看起来他们的网站似乎已经被遗弃了。
我想出了一个想法,用Javascript的setTimeout函数在'x‘时间后运行一些php。php基本上会查询数据库,看看是否有技术人员进入了有问题的会话,如果没有,则将客户端重定向到另一个页面,解释说目前没有人可用,但他们可以留言,等等。
问题是,我没有多少使用JS的经验。
这是一种可能性吗?有没有其他更有效/更高效的方法来实现这一点?
发布于 2013-03-02 02:56:41
是的,你可以这样做。
您可以使用timeout函数每隔x秒执行一次javascript函数。
var time = 200;
setTimeout(function()
{
func();
}, time);然后让函数执行ajax调用,从数据库中请求一些结果,并根据结果执行一些操作。
发布于 2013-03-02 02:58:34
这根本不会太难。当您的超时方法指示:
$.post('url/of/phpscript',
$data /* data you'd like to send*/,
function(returnData) { doSomethingWithThisPhpValue(data) });
function doSomethingWithThisPhpValue(data) {
if (data == signed_in) //...
}当然,值测试和变量最终将取决于您从php方法返回的数据,所以我不能更精确。
发布于 2013-03-03 09:08:06
如何使用使javascript和PHP协同工作而不混淆的示例(ajax):
首先你需要一个javascript函数:
function example()
{
var select = true;
var url = '../scripts/ajax.php';
$.ajax(
{
// Post select to url.
type : 'post',
url : url,
dataType : 'json', // expected returned data format.
data :
{
'select' : select // the variable you're posting.
},
success : function(data)
{
// This happens AFTER the PHP has returned an JSON array,
// as explained below.
var result1, result2, message;
for(var i = 0; i < data.length; i++)
{
// Parse through the JSON array which was returned.
// A proper error handling should be added here (check if
// everything went successful or not)
result1 = data[i].result1;
result2 = data[i].result2;
message = data[i].message;
// Do something with result and result2, or message.
// For example:
$('#content').html(result1);
}
},
complete : function(data)
{
// do something, not critical.
}
});
}现在我们需要接收ajax.php中的posted变量:
$select = isset($_POST['select']) ? $_POST['select'] : false;如果没有设置,三元运算符会让$select的值变为false。
确保您有权在以下位置访问数据库:
$db = $GLOBALS['db']; // En example of a PDO database connection现在,检查是否请求了$select (true),然后执行一些数据库请求,并使用JSON返回它们:
if($select)
{
// Fetch data from the database.
// Return the data with a JSON array (see below).
]
else
{
$json[] = array
(
'message' => 'Not Requested'
);
}
echo json_encode($json);
flush();从数据库获取数据的方式当然是可选的,您可以使用JSON从数据库获取单行,也可以使用它返回多行。
让我给您一个示例,说明如何使用json返回多行(您将在javascript (数据)中迭代它):
function selectMultipleRows($db, $query)
{
$array = array();
$stmt = $db->prepare($query);
$stmt->execute();
if($result = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
foreach($result as $res)
{
foreach($res as $key=>$val)
{
$temp[$key] = utf8_encode($val);
}
array_push($array, $temp);
}
return $array;
}
return false;
}然后你可以这样做:
if($select)
{
$array = array();
$i = 0;
$query = 'SELECT e.result1, e.result2 FROM exampleTable e ORDER BY e.id ASC;';
foreach(selectMultipleRows($db, $query) as $row)
{
$array [$i]["result1"] = $row['result1'];
$array [$i]["result2"] = $row['result2'];
$i++;
}
if(!(empty($array))) // If something was fetched
{
while(list($key, $value) = each($array))
{
$json[] = array
(
'result1' => $value["result1"],
'result2' => $value["result2"],
'message' => 'success'
);
}
}
else // Nothing found in database
{
$json[] = array
(
'message' => 'nothing found'
);
}
}
// ...或者,如果你想接吻(保持简单愚蠢):
初始化一个从数据库中选择一些值并返回一行的基本函数:
function getSingleRow($db, $query)
{
$stmt = $db->prepare($query);
$stmt->execute();
// $stmt->execute(array(":id"=>$someValue)); another approach to execute.
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if($result)
{
$array = (
'result1' => $result['result1'],
'result2' => $result['result2']
);
// An array is not needed for a single value.
return $array;
}
return false;
}然后获取行(或单个值)并使用JSON返回它:
if($select)
{
// Assume that the previously defined query exists.
$results = getSingleRow($db, $query);
if($results !== false)
{
$json[] = array
(
'result1' => $results['result1'],
'result2' => $results['result2'],
'message' => 'success'
);
}
else // Nothing found in database
{
$json[] = array
(
'message' => 'nothing found'
);
}
}
// ...无论如何,我希望我不会因为如此精确而伤到自己的腿,但我喜欢这种技术,@Sabyre想要一个例子,所以它就在这里。如果你发现了一些奇怪的事情,请发表评论。
https://stackoverflow.com/questions/15164828
复制相似问题