我有一个Flash应用程序,该应用程序调用一个在线php文件以读取我的SQL表的某些值。
所以我的AS3代码中有这样一行:
var urlReq:URLRequest = new URLRequest ("http://www.****.com/sql_result.php");
而这在我的PHP:
$connection = mysql_connect("mysql***.perso", "test", "password") or die ("Couldn't connect to the server.");
问题:如果用户处于脱机状态,则无法访问这些值。
有没有办法下载带有AS3代码的SQL表(当用户有Internet时)以便脱机访问它。
喜欢 :
function onConnection(e:Event = null):void{ if(monitor.available) { trace("You are connected to the internet"); read_php_online(); } else { trace("You are not connected to the internet"); read_php_offline(); } monitor.stop(); } function read_php_offline():void{ var urlReq:URLRequest = new URLRequest ("local/sql_result_offline.php"); .. .. }
为了访问离线SQL表,应该有sql_result_offline.php吗?
$connection = mysql_connect("LOCAL", "user", "password");
谢谢,
对于闪光灯:
要使用Flash在本地保存数据,可以使用以下三种方式之一:Flash Player缓存,SharedObject或FileReference对象。对于您的本地文件,请不要使用PHP和MySQL,因为我们仅谈论您获得的数据(json,xml,txt,…)。
-Flash Player缓存:
您应该知道,默认情况下,Flash Player将文件的本地副本放入其缓存中。您可以将此本地副本用作数据的脱机源,但在这里不要忘记Flash Player不会保存远程文件的最新版本,而是保存第一个版本和http://www.example.com/。 data.php与http://www.example.com/data.php?123是不同的,即使它是同一文件!有关此的更多详细信息,请看我对这个问题的回答。
-SharedObject:
我不知道您加载的数据的大小,但是正如Adobe关于SharedObject所说的那样:
…用于在用户计算机上读取和存储有限数量的数据…
我认为这不适用于大文件,不建议存储文件,而是存储一些简单数据。当然,作为浏览器的cookie,SharedOject需要用户的授权才能将数据写入硬盘,用户可以随时将其删除。
-FileReference:
我认为这是做您想要的最好的方式。您应该知道,要使用FileReference保存文件,系统会邀请您的用户选择一个文件来保存数据并再次读取。因此,如果您不希望任何用户与您的应用程序进行交互,请忽略这种方式。
FileReference使用示例:
var local_file_name:String = 'local.data', file:FileReference = new FileReference(), local_file_filter:FileFilter = new FileFilter('local data file', '*.data'), remote_data_url:String = 'http://www.example.com/data.php', url_request:URLRequest, url_loader:URLLoader, connected:Boolean = true; if(connected){ get_remote_data(); } else { get_local_data(); } function get_remote_data(): void { //we use a param to be sure that we have always the last version of our file url_request = new URLRequest(remote_data_url + ('?' + new Date().getTime())); url_loader = new URLLoader(); url_loader.addEventListener(Event.COMPLETE, on_data_loaded); url_loader.load(url_request); } function get_local_data(): void { // show the select dialog to the user to select the local data file file.browse([local_file_filter]); file.addEventListener(Event.SELECT, on_file_selected); } function on_data_loaded(e:Event): void { var data:String = e.target.data; // if the remote data is successfully loaded, save it on a local file if(connected){ // show the save dialog and save data to a local file file.save(data, local_file_name); } // use your loaded data trace(data); } function on_file_selected(e:Event): void { file.addEventListener(Event.COMPLETE, on_data_loaded); file.load(); }
每次向用户显示保存对话框时,此代码都会显示出来,当然,这只是一个示例,您必须根据需要对其进行调整…
编辑
对于AIR:
使用AIR,我们不需要FileReference对象,而是使用File和FileStream对象来保存数据:
// for example, our local file will be saved in the same dir of our AIR app var file:File = new File( File.applicationDirectory.resolvePath('local.data').nativePath ), remote_data_url:String = 'http://www.example.com/data.php', data_url:String = remote_data_url, url_request:URLRequest, url_loader:URLLoader, connected:Boolean = true; if(!connected){ // if we are not connected, we use the path of the local file data_url = file.nativePath; } load_data(); function load_data(): void { url_request = new URLRequest(data_url); url_loader = new URLLoader(); url_loader.addEventListener(Event.COMPLETE, on_data_loaded); url_loader.load(url_request); } function on_data_loaded(e:Event): void { var data:String = e.target.data; if(connected){ // save data to the local file var file_stream:FileStream = new FileStream(); file_stream.open(file, FileMode.WRITE); file_stream.writeUTFBytes(data); file_stream.close(); } trace(data); }
希望能对您有所帮助。