Eu tenho que usar mysql_real_escape_string se eu ligar parâmetros?

Eu tenho o seguinte código:

function dbPublish($status) { global $dbcon, $dbtable; if(isset($_GET['itemId'])) { $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; $stmt = $dbcon->prepare($sqlQuery); $stmt->bind_param('ii', $status, $_GET['itemId']); $stmt->execute(); $stmt->close(); } } 

Preciso de mysql_real_escape_string neste caso ou estou bem?

Não, você não precisa escaping do valor você mesmo (ou seja, não, você não precisa chamar mysqli_real_escape_string ) , quando você está usando instruções preparadas: o mecanismo DB fará isso mesmo.

(Na verdade, se você estivesse chamando mysql_real_escape_string e usando parâmetros vinculados, suas cordas ficariam escapadas duas vezes – o que não seria ótimo: você acabaria com os personagens escapando em todos os lugares …)

Como um sidenote: seus valores são passados ​​como inteiros (como indicado pelo 'ii' ) , então você não precisaria chamar mysql_real_escape_string , mesmo que não estivesse usando instruções preparadas: como o nome indica, esta function é usada para escaping … cordas.

Para números inteiros, geralmente eu uso apenas intval para garantir que os dados que eu injetei em minhas consultas SQL realmente sejam inteiros.

(Mas, como você está usando consultas preparadas, mais uma vez, você não precisa fazer esse tipo de escapando)

Não, você não deve. Combinar os dois resultaria em caracteres de escape visíveis aparecendo em seus dados.

 function dbPublish($status) { global $dbcon, $dbtable; if(isset($_GET['itemId'])) { $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; $stmt = $dbcon->prepare($sqlQuery); $stmt->bind_param('ii', $status, $_GET['itemId']); $stmt->execute(); $stmt->close(); } }