0

私はこのコードを数時間いじっていますが、なぜ機能しないのかわかりません。これは、JQuery を介して渡されるプロファイル更新 php ページであり、実際にテーブルに更新されることを除いて、すべて問題ないようです。私が使用しているコードは次のとおりです。

session_start();
include("db-connect.php");//Contains $con

$get_user_sql = "SELECT * FROM members WHERE username = '$user_username'";
$get_user_res = mysqli_query($con, $get_user_sql);
while($user = mysqli_fetch_array($get_user_res)){
    $user_id = $user['id'];
}
$name = mysqli_real_escape_string($con, $_REQUEST["name"]);
$location = mysqli_real_escape_string($con, $_REQUEST["location"]);
$about = mysqli_real_escape_string($con, $_REQUEST["about"]);

$insert_member_sql = "UPDATE profile_members SET id = '$user_id', names = '$name', location = '$location', about = '$about' WHERE id = '$user_id'"; 
$insert_member_res = mysqli_query($con, $insert_member_sql) or die(mysqli_error($con));
if(mysqli_affected_rows($con)>0){
echo "1";
}else{
echo "0";
}

戻り値が 0 であるため、得られるのはすべて、潜在的な間違いを誰かが見つけることができますか? ありがとう

4

1 に答える 1

1

まず、使用します

require("db-connect.php");

それ以外の

include("db-connect.php");

次に、準備済みステートメントの使用を検討してください。コードは SQL インジェクションに対して脆弱です。

mysql 構文の代わりに PDO を使用することを検討してください。長期的には、PDO を使用する方がはるかに優れていることがわかり、多くの無意味な問題を回避できます。このように実行できます (db-connect ファイルに保持できます)。必要に応じて、データベース接続をグローバルにすることもできます):

// Usage:   $db = connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword);
// Pre:     $dbHost is the database hostname, 
//          $dbName is the name of the database itself,
//          $dbUsername is the username to access the database,
//          $dbPassword is the password for the user of the database.
// Post:    $db is an PDO connection to the database, based on the input parameters.
function connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword)
{
    try
    {
        return new PDO("mysql:host=$dbHost;dbname=$dbName;charset=UTF-8", $dbUsername, $dbPassword);
    }
    catch(PDOException $PDOexception)
    {
        exit("<p>An error ocurred: Can't connect to database. </p><p>More preciesly: ". $PDOexception->getMessage(). "</p>");
    }
}

そして、変数を初期化します。

$host = 'localhost';
$user = 'root';
$databaseName = 'databaseName';
$pass = '';

これで、次の方法でデータベースにアクセスできます

$db = connectToDatabase($host, $databaseName, $user, $pass);

さて、問題を解決する方法は次のとおりです(準備済みステートメントを使用し、SQLインジェクションを回避します):

function userId($db, $user_username)
{
    $query = "SELECT * FROM members WHERE username = :username;";
    $statement = $db->prepare($query); // Prepare the query.
    $statement->execute(array(
        ':username' => $user_username
    ));
    $result = $statement->fetch(PDO::FETCH_ASSOC);
    if($result)
    {
        return $result['user_id'];
    }
    return false
}

function updateProfile($db, $userId, $name, $location, $about)
{
    $query = "UPDATE profile_members SET name = :name, location = :location, about = :about WHERE id = :userId;";
    $statement = $db->prepare($query); // Prepare the query.
    $result = $statement->execute(array(
        ':userId' => $userId,
        ':name' => $name,
        ':location' => $location,
        ':about' => $about
    ));
    if($result)
    {
        return true;
    }
    return false
}

$userId = userId($db, $user_username); // Consider if it is not false.

$name = $_REQUEST["name"];
$location = $_REQUEST["location"];
$about = $_REQUEST["about"];

$updated = updateProfile($db, $userId, $name, $location, $about);

ただし、クエリを確認する必要があります。少し修正しましたが、機能するかどうかは 100% わかりません。

データベースを更新したり、同じ関数に保持したりする代わりに、データベースに挿入する別の関数を簡単に作成できます。エントリの存在が見つかった場合は挿入し、そうでない場合は更新します。

于 2013-03-22T20:33:51.163 に答える