需求: 服务器项目要用到远程其它数据库的数据;
原生态写法:
$mysqli = new mysqli('远程数据库IP地址:端口号', '数据库账号', '数据库密码', '数据库名称');
mysqli_set_charset($mysqli, "utf8");
if(mysqli_connect_errno()){
echo "连接数据库失败:" . mysqli_connect_error();
exit;
}
//查询商品一级分类
$sql = "select cat_id,cat_name,parent_id from goods_cat where parent_id = 0 ";
$result = $mysqli->query($sql);
if ($mysqli->affected_rows > 0) { //查询有数据执行
$option = '<option value="-1" >请选择</option>';
while ($row = $result->fetch_assoc()) {
$option .= "<option value='" . $row['cat_id'] . "'>" . $row['cat_name'] . "</option><br>";
}
echo $option;
}
用TP方法实现demo:
M(数据表,表前缀,数据库类型://账号:密码@IP地址:端口/数据库名);
踩坑:如果是MySQL数据库,数据库类型一定是 mysqli ,写成 mysql 会获取不到数据!
远程数据库使用 M('','',数据库类型://账号:密码@IP地址:端口/数据库名) 等同于 M() 方法!
#当数据表没有前缀的时候,表前缀要设置成 NULL 或者 ' ' (中间一定要有空格)
$model = M("products",' ',"mysqli://root:123456@127.0.0.1:8080/qpl_db");
#当数据表有前缀的时候
$model = M("cat",'goods_ ',"mysqli://root:123456@127.0.0.1:8080/qpl_db");
$res = $model->field("cat_id,cat_name,parent_id")->where("parent_id = 0")->select();
echo $model->_sql();
print_R($res);
连接远程数据库查询数据,插入本地数据库。插入失败,解决方法。
1、$m = M();//首先实例化本地数据库模型
2、$model = M("goods_cat", ' ', $conn);//再实例化远程数据库
3、执行本地插入时,使用$m->add()或$m->execute($sql);
失败demo:
//ThinkPHP控制器 ,商品导入方法
public function goodsImp() {
// set_time_limit(0);
$conn = "mysqli://root:123456@127.0.0.1:8080/qpl_db";
$model = M("goods_cat", ' ', $conn);//实例化远程数据库
获取远程数据,插入本地 。代码。。。。。。。。。
$res = M()->execute($data);//执行本地数据库操作失败,
var_dump($res); //bool(false)
echo M()->_sql(); //执行sql失败,打印sql数据库执行成功
}
解决方法:
//ThinkPHP控制器 ,商品导入方法
public function goodsImp() {
// set_time_limit(0);
$m = M();//实例化本地数据库模型
$conn = "mysqli://root:123456@127.0.0.1:8080/qpl_db";
$model = M("goods_cat", ' ', $conn);//实例化远程数据库
获取远程数据,插入本地 。代码。。。。。。。。。
//把M()换成 $m
$res = $m->execute($data);//执行本地数据库操作失败,
var_dump($res); //int(28992)
echo $m->_sql(); //执行sql成功
}
网友评论