Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено - PullRequest
0 голосов
/ 22 мая 2010
// Getting the id of the restaurant to which we are uploading the pictures
$restaurant_id = intval($_GET['restaurant-id']);

if(isset($_POST['submit']))
{
    $tmp_files = $_FILES['rest_pics']['tmp_name'];
    $target_files = $_FILES['rest_pics']['name'];
    $tmp_target = array_combine($tmp_files, $target_files);
    $upload_dir = $rest_pics_path;
foreach($tmp_target as $tmp_file => $target_file)
    {
        if(move_uploaded_file($tmp_file, $upload_dir."/".$target_file))
        {
            $sql = sprintf("
            INSERT INTO rest_pics
            (branch_id, pic_name)
            VALUES ('%s', '%s')"
            , mysql_real_escape_string($restaurant_id)
            , mysql_real_escape_string(basename($target_file)));
            $result = mysql_query($sql) or die(mysql_error());
        }

Я получаю следующую ошибку:

Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (rest_v2. rest_pics, CONSTRAINT rest_pics_ibfk_1 FOREIGN KEY (branch_id) ССЫЛКИ rest_branches (branch_id) НА УДАЛИТЬ КАСКАД НА ОБНОВЛЕНИЕ КАСКАД

Однако эта ошибка полностью исчезает, и все идет хорошо, когда я ставлю непосредственно идентификатор ресторана (например, 14)вместо переменной $ restaurant_id в запросе sql.

URL, по которому я получаю идентификатор: http://localhost/rest_v2/public_html/admin/add-delete-pics.php?restaurant-id=2

Любая помощь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

Проблема в том, что ваш запрос помещает $ restaurant_id в строку. Вы это процитировали. Вы хотите заменить его следующим:

 $sql = sprintf("
            INSERT INTO rest_pics
            (branch_id, pic_name)
            VALUES (%s, '%s')" //<-- I removed the quotes around the first %s
            , mysql_real_escape_string($restaurant_id)
            , mysql_real_escape_string(basename($target_file)));

Кроме того, вы можете захотеть использовать PDO вместо устаревших функций mysql_ *. Они чище, безопаснее, быстрее и современнее. Вот ваш тот же запрос с использованием PDO:

$statement = $db->prepare('INSERT INTO rest_pics (branch_id, pic_name) VALUES (?, ?)');
$statement->execute(array($restaurant_id, $target_file));

Обратите внимание, что мне не приходилось беспокоиться о кавычках, потому что PDO правильно определяет тип данных для входящих запросов и результатов. Кроме того, это безопасно по умолчанию - ручное экранирование отсутствует. Другими словами, этого бы не случилось, если бы вы использовали PDO.

1 голос
/ 22 мая 2010

Извините, ребята, я понял это. Ошибка была в форме, которую я использовал:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...

вместо:

<form action="" ...

Это привело к загрузке страницы без параметров GET, поэтому branch_id отсутствовал, и поэтому произошла эта хитрая ошибка.

Большое спасибо за ваши ответы:)

...