Intereting Posts

Проблема с синтаксической ошибкой

Привет, ребята, я борется с синтаксической ошибкой моего sql, говоря точно:

«У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса»

Несмотря на то, что код работает и делает то, что я хочу, я все еще получаю информацию об ошибке синтаксиса! и вот код:

$person_id =mysql_query("SELECT person_id FROM person WHERE firstname='$array[0]' AND lastname='$array[1]' AND city='$array[2]' ") or die(mysql_error()); if (mysql_num_rows($person_id) ) { print 'user is already in table'; } else { mysql_query ("INSERT INTO person VALUES (NULL, '$array[0]' ,'$array[1]' , '$array[2]' ") or die(mysql_error()); $person_id = mysql_insert_id(); } $address_id =mysql_query("SELECT address_id FROM address WHERE street='$array[3]' AND city='$array[4]' AND region='$array[5]'") or die(mysql_error()); if (mysql_num_rows($address_id) ) { print ' already in table'; } else { mysql_query ("INSERT INTO address VALUES (NULL, '$array[3]', '$array[4]', '$array[5]'") or die(mysql_error()); $address_id = mysql_insert_id(); } mysql_query ("INSERT INTO person_address VALUES($person_id, $address_id)") or die(mysql_error()); 

Спасибо за любые предложения

Вероятно, потому, что вы не избежали своих ценностей …

Пытаться:

 $query = "SELECT age FROM person WHERE name='".mysql_real_escape_string($array[0])."' AND lastname='".mysql_real_escape_string($array[1])."' AND city='".mysql_real_escape_string($array[2])."'"; 

И прочитайте об инъекции SQL .

РЕДАКТИРОВАТЬ

Я думаю, ваша проблема в том, что вы пытаетесь передать ресурсы результата mysql непосредственно в строку, не выбирая сначала фактические значения.

Попробуй это:

 // Create an array of escaped values to use with DB queries $escapedArray = array(); foreach ($array as $k => $v) $escapedArray[$k] = mysql_real_escape_string($v); // See if the person already exists in the database, INSERT if not $query = "SELECT person_id FROM person WHERE firstname='$escapedArray[0]' AND lastname='$escapedArray[1]' AND city='$escapedArray[2]' LIMIT 1"; $person = mysql_query($query) or die(mysql_error()); if ( mysql_num_rows($person) ) { print 'user is already in table'; $person = mysql_fetch_assoc($person); $person_id = $person['person_id']; } else { $query = "INSERT INTO person VALUES (NULL, '$escapedArray[0]', '$escapedArray[1]', '$escapedArray[2]')"; mysql_query($query) or die(mysql_error()); $person_id = mysql_insert_id(); } // See if the address already exists in the database, INSERT if not $query = "SELECT address_id FROM address WHERE street='$escapedArray[3]' AND city='$escapedArray[4]' AND region='$escapedArray[5]'"; $address = mysql_query($query) or die(mysql_error()); if (mysql_num_rows($address) ) { print 'address already in table'; $address = mysql_fetch_assoc($address); $address_id = $person['address_id']; } else { $query = "INSERT INTO address VALUES (NULL, '$escapedArray[3]', '$escapedArray[4]', '$escapedArray[5]')"; mysql_query ($query) or die(mysql_error()); $address_id = mysql_insert_id(); } // INSERT a record linking person and address mysql_query ("INSERT INTO person_address VALUES($person_id, $address_id)") or die(mysql_error()); 

ДРУГОЕ ИЗМЕНЕНИЕ

Во-первых, я изменил код выше – добавил пару комментариев, исправил пару небольших ошибок, в которых была указана неправильная переменная, и повторно отложил ее, чтобы сделать ее более читаемой.

Во-вторых …

Вы получаете эту дополнительную ошибку, потому что пытаетесь вставить новую строку в таблицу person_address , которая, похоже, не имеет настраиваемого первичного ключа. Легкая работа с проблемой, которую вы в настоящее время имеете, заключается в том, чтобы запустить SELECT в этой таблице, чтобы убедиться, что у вас уже есть запись для этого пользователя, а затем, если вы можете сделать UPDATE вместо INSERT, чтобы изменить существующую запись.

Однако, если я правильно понимаю, что вы здесь делаете, вам действительно не нужна таблица person_address , вам просто нужно добавить еще один целочисленный столбец в таблицу лиц, чтобы удерживать идентификатор соответствующей строки в таблице address . Это сделало бы многие ваши будущие запросы потенциально более простыми и эффективными, так как будет намного проще выбирать данные из обеих таблиц сразу (вы могли бы сделать это с вашей текущей структурой, но это было бы намного более запутанным и неэффективным).

Следующий пример кода можно было бы использовать, если вы добавите еще один целочисленный столбец в конец вашего person и вызовите этот столбец address_id . Вы заметите, что это очень похоже на вышесказанное, но есть два ключевых отличия:

  • Сначала мы делаем адрес, так как мы будем отслеживать отношение в записи человека
  • Мы делаем ОБНОВЛЕНИЕ только в том случае, если находим человека , иначе мы просто ВСТАВЛЯЕМ нового человека, как раньше
 // Create an array of escaped values to use with DB queries $escapedArray = array(); foreach ($array as $k => $v) $escapedArray[$k] = mysql_real_escape_string($v); // See if the address already exists in the database, INSERT if not $query = "SELECT address_id FROM address WHERE street='$escapedArray[3]' AND city='$escapedArray[4]' AND region='$escapedArray[5]'"; $address = mysql_query($query) or die(mysql_error()); if (mysql_num_rows($address) ) { print 'address already in table'; $address = mysql_fetch_assoc($address); $address_id = $person['address_id']; } else { $query = "INSERT INTO address VALUES (NULL, '$escapedArray[3]', '$escapedArray[4]', '$escapedArray[5]')"; mysql_query ($query) or die(mysql_error()); $address_id = mysql_insert_id(); } // See if the person already exists in the database, UPDATE if he does, INSERT if not $query = "SELECT person_id FROM person WHERE firstname='$escapedArray[0]' AND lastname='$escapedArray[1]' AND city='$escapedArray[2]' LIMIT 1"; $person = mysql_query($query) or die(mysql_error()); if ( mysql_num_rows($person) ) { print 'user is already in table'; $person = mysql_fetch_assoc($person); $person_id = $person['person_id']; $query = "UPDATE person SET address_id = '$address_id' WHERE person_id = '$person_id'"; mysql_query($query) or die(mysql_error()); } else { $query = "INSERT INTO person VALUES (NULL, '$escapedArray[0]', '$escapedArray[1]', '$escapedArray[2]', '$address_id')"; mysql_query($query) or die(mysql_error()); } 

Если мы структурируем базу данных таким образом, мы можем это сделать:

 SELECT person.*, address.* FROM person, address WHERE person.address_id = address.address_id AND [some other set of conditions] 

Который вернет запись человека и запись адреса в том же результирующем наборе, все хорошо подобрано для вас по базе данных.

ДАЙТЕ ДРУГОЙ РЕДАКТИРОВАНИЕ

Вам нужно добавить первичный ключ с автоматическим инкрементом в таблицу person_address и выполнить SELECT, чтобы убедиться, что вы не добавляете повторяющиеся записи.

Вы должны заменить заключительную инструкцию INSERT следующим сегментом кода. Этот код предполагает, что у вас есть первичный ключ в таблице person_address называемый relation_id . Он также предполагает, что имена полей id в этой таблице называются так же, как и в двух других таблицах.

 // See if a relation record already exists for this user // If it does, UPDATE it if the address is different // If it doesn't, INSERT an new relation record $query = "SELECT relation_id, address_id FROM person_address WHERE person_id = '$person_id' LIMIT 1"; $relation = mysql_query($query); if ( mysql_num_rows($relation) ) { $relation = mysql_fetch_assoc($relation); if ($relation['address_id'] == $address_id) { print 'The record is identical to an existing record and was not changed'; } else { $relation_id = $relation['relation_id']; $query = "UPDATE person_address SET address_id = '$address_id' WHERE relation_id = '$relation_id'"; mysql_query($query) or die(mysql_error()); } } else { $query = "INSERT INTO person_address VALUES(NULL, '$person_id', '$address_id')"; mysql_query($query) or die(mysql_error()); } 

ДАЖЕ БОЛЬШЕ РЕДАКТИРОВАНИЯ

Попробуйте это, чтобы заменить код сверху:

 // See if a relation record already exists for this user // If it doesn't, INSERT an new relation record $query = "SELECT person_id FROM person_address WHERE person_id = '$person_id' AND address_id = '$address_id' LIMIT 1"; $relation = mysql_query($query); if ( !mysql_num_rows($relation) ) { $query = "INSERT INTO person_address VALUES('$person_id', '$address_id')"; mysql_query($query) or die(mysql_error()); } 

Вы не можете использовать такие значения массива, как внутри кавычек, вместо этого вы можете, например, отделить значения от запроса с помощью точек.

 $query = "SELECT age FROM person WHERE name='".$array[0]."' AND lastname='".$array[1]."' AND city='".$array[2]."'"; 

второй и четвертый запросы не имеют конца ')' в конце значений