在openshift

时间:2016-03-04 16:13:55

标签: php mysql openshift

我已将我的网络应用程序上传到OpenShift。 我的应用程序正在使用PHP和MySQL Cartridges。

我使用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代码(如select,update等)进行一些查询。例如:

$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服务器上运行的本地应用程序上,一切运行完全正常。

任何想法?

2 个答案:

答案 0 :(得分:2)

您不应该像这样使用mysql_query()(请参阅Is this query safe from sql injection?

您可以使用更好的抽象:PHP数据对象(PDO)。 e.g。

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数据库的更好解决方案,而且希望它还能解决您的身份验证问题(或者至少让它们更容易调试)。

答案 1 :(得分:0)

停止并启动您的应用程序(而非重启)。有时需要重新启动apache才能获取新的mysql环境变量。