【问题标题】:Insert data into MySQLi via PHP - WAMP server通过 PHP 将数据插入 MySQLi - WAMP 服务器
【发布时间】:2015-08-02 08:32:34
【问题描述】:

我有一个 wamp 服务器设置。它完美地工作:) 然后我输入 phpMyAdmin 并创建了一个表。使用我制作的 android 应用程序,我想在我的数据库中插入一条记录。 android (java) 代码是正确的,我 100% 确定这一点。但是,当我创建记录时,它不起作用。

由于我对 PHP 不太了解,所以我认为我的错误在于 Register.php 的某个地方

这是文件: 对我的问题的任何见解都会很棒!

请注意,我在真实文件中使用了正确的公共 IP。我刚刚为下面的代码输入了一个随机的。另外,我创建了一个具有所需权限的用户(代替用户名和密码)。数据库“数据库”也确实存在。

Register.php

$con = mysqli_connect("http://148.12.0.153:3306","username","password", "database");

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$phone = $_POST["phone"];
$balance = $_POST["balance"];
$NameAndSurname = $_POST["NameAndSurname"];
$DateOfBirth = $_POST["DateOfBirth"];
$SchoolName = $_POST["SchoolName"];
$Gender = $_POST["Gender"];
$Grade = $_POST["Grade"];
$Class = $_POST["Class"];
$Country = $_POST["Country"];
$Province = $_POST["Province"];
$Address = $_POST["Address"];
$City = $_POST["City"];
$PostalCode = $_POST["PostalCode"];

$statement = mysqli_prepare($con, "INSERT INTO users (username, email, password, phone, balance, NameAndSurname, DateOfBirth, SchoolName, Gender, Grade, Class, Country, Province, Address, City, PostalCode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($statement, "ssssisssiisssssi", $username, $email, $password, $phone, $balance, $NameAndSurname, $DateOfBirth, $SchoolName, $Gender, $Grade, $Class, $Country, $Province, $Address, $City, $PostalCode);
mysqli_stmt_execute($statement);

mysqli_stmt_close($statement);

mysqli_close($con);

【问题讨论】:

  • 我认为 3306 号端口是不必要的。你能把它删掉再试一次吗?
  • echo/print/log $statement 的内容,将这个和表 ddl 添加到帖子中
  • 首先尝试从主机中删除 http:// 并尝试不带 http:// 的 ip 并尝试使用 echo mysqli_error($con) 打印 mysqli 错误;
  • 我唯一能看到的可能是问题(除了前面提到的附加到服务器地址的端口,它应该只是一个 IP 地址或主机名 - 没有 http,没有端口)是字段名称没有用反引号括起来,密码在 mysql 中似乎具有特殊意义
  • 收到的错误是用户'mingan'@'localhost'的访问被拒绝(使用密码:YES)该用户具有“所有权限”吗?我不知道怎么了..

标签: php android mysql mysqli wamp


【解决方案1】:

好的,这里要提一些事情。

首先,您使用 android 应用程序在您的 Apache 服务器上启动此 Register.php 脚本,就像它是一个网页一样,因此此脚本在服务器上而不是您的手机或平板电脑上运行。因此 Apache 和 MySQL 以及脚本都在 WAMPServer PC 上运行。所以你的连接字符串不需要一些真实的IP地址,它可以使用并且应该使用localhost127.0.0.1之类的东西

接下来,您的数据库访问代码假设一切都会正确发生,但情况可能并非如此,请参见上段。因此,请始终检查状态代码并将状态报告给调用程序,以便它可以就下一步做什么做出明智的决定。将错误记录到 PHP 错误日志也是一个好主意,因此当它上线时,您可以检查日志并查看是否有任何问题,而无需运行手机应用程序。

所以试试这些改变:

// init the reply class
$result = new stdClass();
$result->status = 'OK';  


$con = mysqli_connect("127.0.0.1","username","password", "database");
if ( ! $con ) {
    $result->status        = 'ERROR';
    $result->error_code    = mysqli_connect_errno();
    $result->error_message = mysqli_connect_error();
    // terminate and report to error log
    error_log('Database connection failed'.mysqli_connect_error(), 0);
    echo json_encode($result);  // return status as json
    exit;
}

// You should never use data sent from the screen without
// validating it and cleaning it up so you need some sort of 
// $_POST = validate_sanity($_POST);

$username       = $_POST["username"];
$email          = $_POST["email"];
$password       = $_POST["password"];
$phone          = $_POST["phone"];
$balance        = $_POST["balance"];
$NameAndSurname = $_POST["NameAndSurname"];
$DateOfBirth    = $_POST["DateOfBirth"];
$SchoolName     = $_POST["SchoolName"];
$Gender         = $_POST["Gender"];
$Grade          = $_POST["Grade"];
$Class          = $_POST["Class"];
$Country        = $_POST["Country"];
$Province       = $_POST["Province"];
$Address        = $_POST["Address"];
$City           = $_POST["City"];
$PostalCode     = $_POST["PostalCode"];

$sql = "INSERT INTO users 
           (username, email, password, phone, 
            balance, NameAndSurname, DateOfBirth, 
            SchoolName, Gender, Grade, Class, 
            Country, Province, Address, City, 
            PostalCode) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

$statement = mysqli_prepare($con, $sql );
if ( ! $statement ) {
    $result->status        = 'ERROR';
    $result->error_code    = mysqli_errno();
    $result->error_message = mysqli_error();
    // terminate and report to error log
    error_log('Database connection failed'.mysqli_error(), 0);
    echo json_encode($result);  // return status as json
    exit;
}

$res = mysqli_stmt_bind_param($statement, "ssssisssiisssssi",
               $username, $email, $password, $phone, $balance, 
               $NameAndSurname, $DateOfBirth, $SchoolName, $Gender, 
               $Grade, $Class, $Country, $Province, $Address, $City, 
               $PostalCode);

if ( ! $res ) {
    $result->status        = 'ERROR';
    $result->error_code    = mysqli_errno();
    $result->error_message = mysqli_error();
    // terminate and report to error log
    error_log('Database connection failed'.mysqli_error(), 0);
    echo json_encode($result);  // return status as json
    exit;
}

if ( mysqli_stmt_execute($statement) ) {
    $result->status        = 'OK';
    $result->message       = 'Row deleted';
    echo json_encode($result);  // return status as json
    exit;
} else {
    $result->status        = 'ERROR';
    $result->error_code    = mysqli_errno();
    $result->error_message = mysqli_error();
    // terminate and report to error log
    error_log('Database DELETE failed'.mysqli_error(), 0);
    echo json_encode($result);  // return status as json
    exit;
}

//mysqli_close($con);
//PHP will do all the connection and statment closing automatically 
// So you dont actually need to do any of this unless you are running 
// a script the will consume large numbers of statement and you may
// feel it necessary to close them out to kepp the memory footprint smaller

【讨论】:

  • 你是什么意思它工作它只是应该识别错误。无论我想什么,我都在不知不觉中修复了一些东西
【解决方案2】:

把mysqli_stmt_close改成

mysqli_stmt_close($statement) or die(mysqli_error());

这将为您提供更准确的错误信息,说明失败的原因。

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2016-04-05
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多