Некоторые общие замечания: Не используйте bindParam()
, если вы не используете процедуру, которая изменяет значение параметра. Поэтому use bindValue()
. bindParam () принимает значение аргумента как ссылочную переменную. Это означает, что вы не можете сделать $stmt->bindParam(':num', 1, PDO::PARAM_INT);
- это вызывает ошибку. Кроме того, PDO имеет свои собственные функции для управления транзакциями, вам не нужно выполнять запросы вручную.
Я немного переписал ваш код, чтобы пролить свет на то, как можно использовать PDO:
if($_POST['groupID'] && is_numeric($_POST['groupID']))
{
// List the SQL strings that you want to use
$sql['privileges'] = "DELETE FROM users_priveleges WHERE GroupID=:groupID";
$sql['groups'] = "DELETE FROM groups WHERE GroupID=:groupID"; // You don't need LIMIT 1, GroupID should be unique (primary) so it's controlled by the DB
$sql['users'] = "DELETE FROM users WHERE Group=:groupID";
// Start the transaction. PDO turns autocommit mode off depending on the driver, you don't need to implicitly say you want it off
$pdo->beginTransaction();
try
{
// Prepare the statements
foreach($sql as $stmt_name => &$sql_command)
{
$stmt[$stmt_name] = $pdo->prepare($sql_command);
}
// Delete the privileges
$stmt['privileges']->bindValue(':groupID', $_POST['groupID'], PDO::PARAM_INT);
$stmt['privileges']->execute();
// Delete the group
$stmt['groups']->bindValue(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$stmt['groups']->execute();
// Delete the user
$stmt['users']->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$stmt['users']->execute();
$pdo->commit();
}
catch(PDOException $e)
{
$pdo->rollBack();
// Report errors
}
}
Это прямо в предупреждении: ISO C запрещает преобразование указателя функции в тип указателя объекта, который включает в себя void*
. Смотрите также этот вопрос .
Вы просто не можете напечатать адрес функции переносимым способом, поэтому вы не можете избавиться от предупреждения. Del>
Вы можете напечатать указатель на функцию, используя Предложение @R ..