2017-10-16 1 views
0

私は何らかの理由でフォロースクリプトがハングすることがわかりました。それはロードされ、PHPにはエラーは見られませんが、データを処理しません(別のログインデータベースが開いているコンテキストにあることに注意してください)。次は、SQL接続を開くように見えないのはなぜですか?

process.phpでは、

<? PHP 
//Process the POST data in prepration to write to SQL database. 
$_POST['chat_input'] = $input; 
$time = date("Y-m-d H:i:s");  
$ip = $_SERVER['REMOTE_ADDR']; 
$name = $_SESSION['username'];  
$servername = "localhost"; 
$username = "id3263427_chat_user"; 
$password = "Itudmenif1!Itudmenif1!"; 
$dbname = "id3263427_chat_user"; 
$id = "NULL"; 

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 

if($link === false){ 
    die("ERROR: Could not connect. " . mysqli_connect_error()); 
} 

$sql = 'INSERT INTO `chat` (`id`, `username`, `ip`, `timestamp`, 
     `message`) VALUES ('$id','$name', '$ip', '$time', '$input')'; 

if(mysqli_query($link, $sql)){ 
    mysqli_close($conn); 
    header('Location: ../protected_page.php'); 
} else { 
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
} 

?> 

次のように上記のスクリプトに渡されたHTMLフォームは次のとおりです。

<form action="/process.php" method="post" id="chat"> 
    <b> Send A Message (500 Character Max):</b><br> 
    <textarea name="chat_input" form="chat" size="500"></textarea> 
    <input type="submit" value=submit> 
</form> 

ないこれで何が起こっているか確認してください。

+0

これは本当に$ _POST ['chat_input'] = $ input; 'ではなく、この' $ input = $ _POST ['chat_input']; '? – pmahomme

+0

私はその点を訂正しており、何が起こっているのかには何の影響もないようです。 –

+0

エラーが報告されていないことを確認してくださいあなたのsql文字列をチェックしてください。カラム名を簡単に引用する場合は二重引用符で囲む必要があります – douxsey

答えて

2

'で$ idの前に$ sql文字列を閉じているため、構文エラーが発生しました。

あなたの$ id変数についてはどうですか?現在のコードでは、文字列 "NULL"を挿入します。 SQL値nullを設定する場合は、​​を使用するか、値を挿入しないでください。

データベースでIDを設定する場合は、空白のままにします。

$input = $_POST['chat_input']; 
$id = null; 

$conn = new mysqli($servername, $username, $password, $dbname); 

if($conn->connect_error){ 
    die("ERROR: Could not connect. " . $conn->connect_error); 
} 

まずソリューション

これは、生産コードがない場合は、ステートメントに直接変数を挿入できますが、あなたができるので、あなたは、あなたのSQL文字列のために"の代わり'を使用する必要があります変数を挿入し、文字列を閉じることなく'を挿入します。

$sql = "INSERT INTO chat (id, username, ip, timestamp, message) VALUES ('$id', '$name', '$ip', '$time', '$input')"; 
if($conn->query($sql) === true) { 
$conn->close(); 
header('Location: ../protected_page.php'); 
} else { 
echo "ERROR: Could not able to execute $sql. " .$conn->error; 
$conn->close(); 
} 

第二の溶液

より良いアプローチは、プリペアドステートメントになります。 bind_param()

$stmt = $conn->prepare('INSERT INTO chat (username, ip, timestamp, message) VALUES (?, ?, ?, ?)'); 
$stmt->bind_param("ssss", $username, $ip, $time, $input); 

if($stmt->execute()) { 
$stmt->close(); 
$conn->close(); 
header('Location: ../protected_page.php'); 
} else { 
echo "ERROR: Could not able to execute $stmt. " . $conn->error; 
$stmt->close(); 
$conn->close(); 
} 

"s"あなたが整数を挿入したい場合は、代わりに"i"を使用し、指定した位置に文字列を定義します。

bindParam("sis", $string, $integer, $string);

関連する問題