A maneira mais fácil de usar INSERT...ON DUPLICATE KEY UPDATE é usar a cláusula VALUES da seguinte maneira, para que você não precise repetir os parâmetros na cláusula UPDATE. Eles apenas usam os mesmos valores para cada coluna que você passou na cláusula VALUES:
if($stmt = $mysqli -> prepare("
INSERT INTO user_info (city, state, website, public_contact,
user, zipcode, pic, emailme)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
city = VALUES(city),
state = VALUES(state),
website = VALUES(website),
public_contact = VALUES(public_contact),
user = VALUES(user),
zipcode = VALUES(zipcode),
pic = VALUES(pic),
emailme = VALUES(emailme)") {
$stmt -> bind_param("sssssssi",$city, $state, $website, $public_contact,
$user, $zipcode, $pic, $emailme);
$stmt -> execute();
$stmt -> close();
}
A sintaxe IODKU requer que você defina cada coluna individualmente. Você não pode listá-los todos em uma cláusula como você estava tentando fazer.
Você deve sempre relatar quaisquer erros de qualquer chamada para prepare() ou execute(). Ou você pode fazer o mysqli lançar exceções:
$mysqli -> report_mode = MYSQLI_REPORT_STRICT;
Além disso, você não precisa bind_result(), pois não há nenhum conjunto de resultados de INSERT:
// NO: $stmt -> bind_result($result);