通过 php 连接到 MySQL 以创建新的 table 时出错
Error when connecting to MySQL through php to create a new table
我正在编写一个与 MySQL 数据库一起工作的 Android 应用程序。该数据库中有一个 table 来记录一些结果。
我的应用能够与 table 通信并执行 CRUD
操作(create
、delete
、read
和 update
) 使用 PHP.
但是我现在想要的是以编程方式在该数据库中创建新的 table。我手动使用并测试了以下 PHP 代码,它工作正常,但在从我的应用发出请求时出现错误。
以下是代码片段和错误消息。非常感谢和欢迎回答或讨论。
这是我发送创建 table 请求的地方:
table_name = "Background_Apps_Test";
params.add(new BasicNameValuePair("table_name", table_name));
json = jsonParser.makeHttpRequest(Config.FILE_UPLOAD_URL+"create_table.php", "POST", params);
这是我请求创建的 php 文件:
<?php
if (isset($_POST['table_name']){
$table_name = $_POST['table_name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$query = "
CREATE TABLE $table_name (
pid int(11) primary key auto_increment,
l_type varchar(100) not null,
l_info varchar(5000) not null,
l_ip varchar(15),
created_at timestamp default now()
)";
}
?>
这是错误信息:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:857)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at mtb.saeed.com.mytestingbenchmark.JSONParser.makeHttpRequest(JSONParser.java:52)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator.Automate(XmlFileCreator.java:400)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator.onClick(XmlFileCreator.java:260)
at android.view.View.performClick(View.java:4211)
at android.view.View$PerformClick.run(View.java:17446)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
问题出在您的 Android 代码上。
事实上,Android 强制您 运行 在与主线程不同的线程中执行所有网络代码。例如,尝试将您的代码(调用服务器的代码)移动到 AsyncTask。
已编辑:
这是您的确切问题:
How to fix android.os.NetworkOnMainThreadException?
我正在编写一个与 MySQL 数据库一起工作的 Android 应用程序。该数据库中有一个 table 来记录一些结果。
我的应用能够与 table 通信并执行 CRUD
操作(create
、delete
、read
和 update
) 使用 PHP.
但是我现在想要的是以编程方式在该数据库中创建新的 table。我手动使用并测试了以下 PHP 代码,它工作正常,但在从我的应用发出请求时出现错误。
以下是代码片段和错误消息。非常感谢和欢迎回答或讨论。
这是我发送创建 table 请求的地方:
table_name = "Background_Apps_Test";
params.add(new BasicNameValuePair("table_name", table_name));
json = jsonParser.makeHttpRequest(Config.FILE_UPLOAD_URL+"create_table.php", "POST", params);
这是我请求创建的 php 文件:
<?php
if (isset($_POST['table_name']){
$table_name = $_POST['table_name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$query = "
CREATE TABLE $table_name (
pid int(11) primary key auto_increment,
l_type varchar(100) not null,
l_info varchar(5000) not null,
l_ip varchar(15),
created_at timestamp default now()
)";
}
?>
这是错误信息:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:857)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at mtb.saeed.com.mytestingbenchmark.JSONParser.makeHttpRequest(JSONParser.java:52)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator.Automate(XmlFileCreator.java:400)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator.onClick(XmlFileCreator.java:260)
at android.view.View.performClick(View.java:4211)
at android.view.View$PerformClick.run(View.java:17446)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
问题出在您的 Android 代码上。 事实上,Android 强制您 运行 在与主线程不同的线程中执行所有网络代码。例如,尝试将您的代码(调用服务器的代码)移动到 AsyncTask。
已编辑: 这是您的确切问题: How to fix android.os.NetworkOnMainThreadException?