2016-03-04 22 views
0

我已經將我的Web應用程序上傳到OpenShift。 我的應用程序使用PHP和MySQL Cartridges。在openshift中使用PHP + MySQL時,訪問被拒絕用戶'@'localhost'(使用密碼:NO)

我創建了一些使用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) 

當我手動發出這些命令在實際的機器一切都正常運行。所以此工程: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服務器上運行時,一切都運行良好。

有什麼想法?

+0

'var_dump(getenv('OPENSHIFT_MYSQL_DB_HOST'))'說什麼? – Naumov

+0

顯示正確的主機IP:「127.2.20.2」 – user3444042

+0

我知道你連接到'mysqli',但使用'mysql'' mysql_query'使用正確的擴展名 – Naumov

回答

0

停止並啓動您的應用程序(不是重新啓動)。有時需要重新啓動apache來獲取新的mysql環境變量。

+0

好吧,我試圖(rhc app-stop/app-start)在啓動命令返回'<應用程序名稱>開始'後,我仍然得到相同的行爲 – user3444042

2

你真不該使用mysql_query()那樣(見Is this query safe from sql injection?

您可以使用一個更好的抽象: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 

這不僅是用於處理MySQL數據庫和PHP更好的解決方案,但希望它也將解決您的身份驗證問題(或使它們更容易調試,至少)。

+0

@ user3444042希望這也將解決您的身份驗證問題 –

相關問題