PHP / mysqli: mysqli_stmt_bind_param ile ekleme IP adresi ()

2 Cevap php

Ben ziyaretçinin IP adresini saklamak için bir işaretsiz tamsayı alanı içeren bir veritabanı tablo var:

`user_ip` INT(10) UNSIGNED DEFAULT NULL,

Burada IP adresini saklamak için çalışır PHP kod parçacığını bulunuyor:

$ipaddr = $_SERVER['REMOTE_ADDR'];
if ($stmt = mysqli_prepare($dbconn, 'INSERT INTO visitors(user_email, user_ip) VALUES (?,?)'))
{
    $remote_ip = "INET_ATON('$ipaddr')";
    mysqli_stmt_bind_param($stmt, 'ss', $email, $remote_ip);
    if (mysqli_stmt_execute($stmt) === FALSE) return FALSE;
    $rows_affected = mysqli_stmt_affected_rows($stmt);
    mysqli_stmt_close($stmt);
}

The INSERT operation succeeds, however the user_ip field contains a null value. I have also tried changing the parameter type in mysqli_stmt_bind_param() (which was set to string in the above example) to integer, i.e. mysqli_bind_param(... 'si',...) - but to no avail.

Ben de yerine mysql'in INET_ATON () SQL işlevinin kodu aşağıdaki bit kullanarak denedim:

function IP_ATON($ipaddr)
{
    $trio = intval(substr($ipaddr,0,3));
    return ($trio>127) ? ((ip2long($ipaddr) & 0x7FFFFFFF) + 0x80000000) : ip2long($ipaddr);
}

Hala çalışmıyor - 'user_ip' alanında hala boş olarak ayarlanır. Ben tamsayı ve hem de $ ip_addr değişken geçirmeden denedim mysqli_bind_param dize () - boşuna.

Bu sorunun parametreli insert ile yatıyor gibi görünüyor.

Aşağıdaki "old-style" kod herhangi bir sorun olmadan çalışıyor:

mysqli_query(..., "INSERT INTO visitors(user_email, user_ip) VALUES ('$email',INET_ATON('$ipaddr'))");

Ben burada yanlış ne yapıyorum?

Şimdiden teşekkürler!

2 Cevap

Ben bu gibi bakmak gerektiğini düşünüyorum:

$ipaddr = $_SERVER['REMOTE_ADDR'];
if ($stmt = mysqli_prepare($dbconn, 'INSERT INTO visitors(user_email, user_ip) VALUES (?, INET_ATON(?))'))
{
    mysqli_stmt_bind_param($stmt, 'ss', $email, $ipaddr);
    if (mysqli_stmt_execute($stmt) === FALSE) return FALSE;
    $rows_affected = mysqli_stmt_affected_rows($stmt);
    mysqli_stmt_close($stmt);
}

Tarafından ikinci değişiklik Not? ve hangi parametreler mysqli_stmt_bind_param içine gönderilir.

Eğer mysqli_stmt_bind_param geçmek parametreler sokulacak gerçek değerleri ve hiçbir fonksiyon olması gerektiği için.