我使用以下脚本使用PHP使用数据库:
try{
$db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想使用此数据库句柄使用此代码执行请求:
try{
$query = $db->prepare("INSERT INTO users (...) VALUES (...);");
$query->execute(array(
'...' => $...,
'...' => $...
));
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)
这是问题所在:
$GLOBALS['errors'][]数组,之后脚本仍在运行,注意:未定义的变量:第32行的C:\ xampp\htdocs [...]\test.php中的db
致命错误:在第32行的C:\ xampp\htdocs [...]\test.php中调用非对象的成员函数prepare()
注意:第32行是$query = $db->prepare(...)指令.
也就是说,脚本崩溃了,try/catch似乎没用.你知道为什么第二次尝试/捕获不起作用以及如何解决它?
谢谢您的帮助!
编辑:有一些非常好的回复.我已经验证了一个不是我想要做的,但这可能是最好的方法.
我有一个服务器通过 websocket 发送原始音频块。我们的想法是检索它们并以尽可能流畅的播放方式播放它们。
这是最重要的一段代码:
ws.onmessage = function (event) {
var view = new Int16Array(event.data);
var viewf = new Float32Array(view.length);
audioBuffer = audioCtx.createBuffer(1, viewf.length, 22050);
audioBuffer.getChannelData(0).set(viewf);
source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioCtx.destination);
source.start(0);
};
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但在播放中存在一些裂缝:网络延迟并不总是恒定的,所以最新的数据块并没有完全到达正在播放的前一个数据块的末尾,所以我可以得到任何一个两个缓冲区一起播放很短的时间或根本不播放。
我试过:
source.onended播放下一个,但它不是无缝的:每个块的末尾都有一个裂缝,每个接缝都在总体上累积,因此与流相比,播放越来越晚。是否有适当的解决方案来修复该播放?唯一的要求是播放来自 websocket 的未压缩音频。
编辑:解决方案:鉴于我知道我的缓冲区长度,我可以这样安排播放:
if(nextStartTime == 0) nextStartTime = audioCtx.currentTime + (audioBuffer.length / audioBuffer.sampleRate)/2;
source.start(nextStartTime);
nextStartTime += audioBuffer.length / audioBuffer.sampleRate;
Run Code Online (Sandbox Code Playgroud)
第一次,我将播放的开始时间安排在半个缓冲之后,以允许最大的意外延迟。然后,我将下一个缓冲区开始时间存储在缓冲区结束的最后。