我已经将我的Web应用程序上传到OpenShift。我的应用程序使用的是PHP和MySQL墨盒。
我已经使用PHPmyAdmin(通过openshift Web界面)创建了一些数据库。 显然,每个数据库都有自己唯一的名称。在我的PHP代码中,我以这种方式初始化与我的一个MySQL数据库的连接:
$mysql_database=<some data base>;
$connection = mysqli_connect(getenv('OPENSHIFT_MYSQL_DB_HOST'), getenv('OPENSHIFT_MYSQL_DB_USERNAME'), getenv('OPENSHIFT_MYSQL_DB_PASSWORD'), "$mysql_database", getenv('OPENSHIFT_MYSQL_DB_PORT')) or die("Error: " . mysqli_error($connection));
mysql_set_charset("utf8", $connection);
然后在其他地方,我正在从我的PHP代码对我连接到的数据库中的表进行一些查询(如选择,更新等)。 例如:
$query_run=mysql_query("SELECT * from `$some_table` WHERE `id`='$id'")
连接本身不会失败,但是我的所有查询都失败了:
Access denied for user ''@'localhost' (using password: NO)
当我在实际机器上手动发出这些命令时,一切运行良好。 所以这行得通: 使用 PuTTy SSH到我的机器中,然后执行以下操作:
mysql -u $OPENSHIFT_MYSQL_DB_USERNAME -h $OPENSHIFT_MYSQL_DB_HOST -P $OPENSHIFT_MYSQL_DB_PORT -p <some data base>
mysql>SELECT * from `<some table>` WHERE `id`='<some id>'
我没有修改任何内容的安全设置,也没有更改为 MySQL 操作生成的用户名/密码。
此外,在xampp Apache+MySQL服务器上运行的本地应用程序上,一切都运行良好。
有什么想法吗?
你真的不应该使用这样的mysql_query()
(请参阅此查询对 sql 注入安全吗?
你可以使用一个更好的抽象:PHP数据对象(PDO)。
try {
// Set your connection variables
$host = getenv('OPENSHIFT_MYSQL_DB_HOST');
$port = getenv('OPENSHIFT_MYSQL_DB_PORT');
$username = getenv('OPENSHIFT_MYSQL_DB_USERNAME');
$password = getenv('OPENSHIFT_MYSQL_DB_PASSWORD');
$dbname = 'database_name';
// Create the connection string
$conn_str = "mysql:host=$host;port=$port;dbname=$dbname"
// And create a db handler with PDO
$dbh = new PDO($conn_str, $username, $password);
// Prepare whatever statement, could also be SELECT etc
$stmt = $dbh->prepare("INSERT INTO TABLE_NAME (name, value) VALUES (?, ?)");
// Binding parameters like this prevents SQL Injection
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// Assign values to the variables
$name = 'Random';
$value = 1;
// Finally, execute the statement
$stmt->execute();
}
catch(PDOException $e) {
// Print out whatever error we got
echo $e->getMessage();
}
// Don't forget to close the connection
$dbh = null
这不仅是使用 PHP 处理 MySQL 数据库的更好解决方案,而且希望它也能解决您的身份验证问题(或至少使它们更容易调试)。
停止并启动应用程序(不是重新启动)。 有时需要重新启动 apache 来获取新的 mysql 环境变量。