В какви полета се записват големи числа и..

sentenello

Registered
Здравейте,
В момента вземам от XML стойности от сорта на id:100568714 , дата под формата Дата:2014-09-14T12:30:00 и видове залог: залог:%1%.

Как е най-добре да ги запиша в MYSQL, в какъв тип поле ? ID в BIGINT? Датата в DATETIME като първо махна това "T" с str_replace? и залога в VARCHAR като премахна "%" отново с str_replace ?[/url]
 
И трите полета ли ? И ако да, после няма ли да ми е по-трудно ако реша да изкарвам нещо по дата, и да сравнявам дати или пък да направя заявка за нещо с дата 2 дни напред ?
 
Очевидно залогът и id-тата са числа. => използвай int, за ид-то оставяш стойността празна (да бъде максималната), за залога използвай int(1) при възможности 0-9, int(2) за възможности 0-99 и т.н.

За датата ще ти е най-лесно да използваш DATETIME. Можеш също да я записваш като число (върнатата от strtotime стойност).
 
за числа нищо не ти пречи да ползваш int, за дата или ползвай date или int(ако формата е в timestamp) и текста да си е в Varchar. Това е според мене, иначе може да погледнеш : http://help.scibit.com/mascon/masconMySQL_Field_Types.html за повече информация :) :?: :?:
 
Значи за ID-тата ще използвам INT без да задавам дължина, за датата DATETIME, а за залога мисля да го направя VARCHAR, а не INT, защото има залози от типа на 1-2 и не са само числа.
 
Имам още един въпрос, и за да не отварям нова тема ще го пусна тук.

В момента имам
Код:
$sportID =  $sportTYPE->getAttribute('id');
 $sportname =  $sportTYPE->getAttribute('name');
		$add = "INSERT INTO sport (id, name) VALUES ('$sportID', '$sportname')";

Което ми вкара в таблицата
Код:
1
Football
2
Tennis
3
Formula 1
4
Basketball
5
Rugby Union

Само че при повторно пускане на файла, ми го продължи и ги вкара отново, при положение че вече съществуват. Въпроса ми е как да направя заявката за вкарване на данни, да не вкарва нещо ако то вече съществува?
 
sentenello каза:
...
а за залога мисля да го направя VARCHAR, а не INT, защото има залози от типа на 1-2 и не са само числа.
Не съм съвсем съгласен.
Ако винаги ще изглежда по този начин, можеш да го направиш отново int(2), като двете цифри съответстват на тези от залога.
Примерно имаш 2-3, ще запишеш 23, ако имаш 5-1, ще запишеш 51 и т.н.

Другият вариант е да използваш char(3), (предполагам, че няма да има двуцифрени числа в залога?), и да записваш данните така - "2-3", без спейсове.

Защо не varchar? Защото varchar пази един байт за дължината на полето. Тогава char какво прави? Допълва с нули до края, примерно ако си задал char(10) и въведеш abcdef, ще имаш четири допълнителни нули. Но ако полето има фиксирана дължина и винаги е дълго 5 символа, varchar винаги ще пази един допълнителен байт, а char - няма.

А за другия въпрос

Разгледай това:
http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql

Може и така - да използваш допълнителна заявка. Примерно
PHP:
if($mysqli_conn->query("select 1 from spot where id = $spotId and name=$spotname limit 1")->num_rows) {
echo "вече има запис";
}else{
echo "няма запис. записване";
//и заявката
}
 
Благодаря за изчерпателния отговор. Сега да ти кажа защо мисля да го направя Varchar, защото в този ред ще се записват и имена някой път. Просто има възможност това поле да съдържа "Аржентина" примерно.

Заявката която си ми написал ми извежда
Fatal error: Call to a member function query() on a non-object in

Сега ще поразровя темата в stackoverflow
 
sentenello каза:
Благодаря за изчерпателния отговор. Сега да ти кажа защо мисля да го направя Varchar, защото в този ред ще се записват и имена някой път. Просто има възможност това поле да съдържа "Аржентина" примерно.

Заявката която си ми написал ми извежда
Fatal error: Call to a member function query() on a non-object in

Сега ще поразровя темата в stackoverflow
Грешката се появява, защото не си си оправил $mysqli_conn. Трябва да идва от
$mysqli_conn = new mysqli(...)
или oт
$mysqli_conn = mysqli_connect(.....)
 
sentenello каза:
Благодаря за изчерпателния отговор. Сега да ти кажа защо мисля да го направя Varchar, защото в този ред ще се записват и имена някой път. Просто има възможност това поле да съдържа "Аржентина" примерно.

Заявката която си ми написал ми извежда
Fatal error: Call to a member function query() on a non-object in

Сега ще поразровя темата в stackoverflow
Пробвай с тази функция като си настроиш таблиците в сяла:
PHP:
function Verify($sportID,$sportname) 
		{        
			$chek = mysql_query("SELECT * FROM `sport` WHERE `id`='{$sportID}' and `name`='{$sportname}';")or die(mysql_error());        
			return mysql_num_rows($chek)? 1 : 0; 
		}
if(Verify($sportID,$sportname) == 1) 
		{
			echo "Има запис";
		}
 
Направих го така..
Код:
$sportID =  $sportTYPE->getAttribute('id');
 $sportname =  $sportTYPE->getAttribute('name');
        echo "Евент: $sportID - $sportname <br>";
		if($conn->query("select 1 from sport where id = $sportID and name=$sportname limit 1")->num_rows) {
echo "вече има запис";
}else{
echo "няма запис. записване";
//и заявката

като имам
$conn = mysql_connect($dbhost, $dbuser, $dbpass)or die(mysql_error());

Правилно ли съм те разбрал или пак съм в грешка ?


ЕДИТ: С кода на dakata__92
Не ми записва ако го има, но ми записва само първия ред, в случая football
 
като имам
$conn = mysql_connect($dbhost, $dbuser, $dbpass)or die(mysql_error());

Правилно ли съм те разбрал или пак съм в грешка ?
НЕ! В никакъв случай не използвай mysql_*. Дори не знаех че още някой го ползва. Използвай
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
Така вече трябва да работи правилно.
 
Пак ми дава грешка .
Кода ми представлява това.

$dbhost = "....";
$dbuser = "....";
$dbpass = "....";
$dbname = "matchevent";
$conn = mysqli_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
mysql_select_db($dbname, $conn)or die(mysql_error());

foreach ($sportTYPE as $sportTYPE) {

$sportID = $sportTYPE->getAttribute('id');
$sportname = $sportTYPE->getAttribute('name');
echo "Евент: $sportID - $sportname <br>";
if($conn->query("select 1 from sport where id = $sportId and name=$sportname limit 1")->num_rows) {
echo "вече има запис";
}else{
echo "няма запис. записване";
//и заявката
}

Грешката която ми изкарва е..
mysql_select_db(): supplied argument is not a valid MySQL-Link resource

EDIT: Преправих mysql_select_db($dbname, $conn)or die(mysql_error()); на mysqli_select_db($conn, $dbname )or die(mysql_error());
и се оправи, но сега проблема е че ми дава грешка в която пише че очаква още един параметър в този ред
$query = mysqli_query($add);
грешката: Warning: mysqli_query() expects at least 2 parameters, 1 given in /home/progn0zi/public_html/futbolnizalozi/xmltest.php on line 27
 
Току що, разбрах че има голяма разлика между mysql и mysqlI. Преправих всичките заявки на mysqli и проработи без да дава грешки, но когато отворих 2 пъти файла и ми ги записа отново, вместо да каже че има такъв запис и да не ги запише

EDIT: Стигнах до извода че кода на drakata ще ми свърши работа, само че съм вкарал функцията в foreach и при втория loop ми изписва грешка
Код:
Fatal error: Cannot redeclare verify()

Не мога да сетя как да изкарам функцията от foreach и в същото време да си взема информацията все едно е вътре. При първия цикъл 1, втория 2 и т.н.
 
Ето това е кода, когато функцията е в цикъла.
Код:
$sportTYPE = $xmlDoc->getElementsByTagName( "sport" );
foreach ($sportTYPE as $sportTYPE) {

 $sportID =  $sportTYPE->getAttribute('id');
 $sportname =  $sportTYPE->getAttribute('name');
        echo "Евент: $sportID - $sportname <br>";
	function Verify($sportID,$sportname) 
                {        
                        $chek = mysql_query("SELECT * FROM `sport` WHERE `id`='{$sportID}' and `name`='{$sportname}';")or die(mysql_error());        
                        return mysql_num_rows($chek)? 1 : 0; 
                }
if(Verify($sportID,$sportname) == 1) 
                {
                        echo "Има запис";
                }else {
		$add = "INSERT INTO sport (id, name) VALUES ('$sportID', '$sportname')";
$query = mysql_query($add);
		}

EDIT: Преместих
Код:
	function Verify($sportID,$sportname) 
                {        
                        $chek = mysql_query("SELECT * FROM `sport` WHERE `id`='{$sportID}' and `name`='{$sportname}';")or die(mysql_error());        
                        return mysql_num_rows($chek)? 1 : 0; 
                }
точно над foreach и заработи правилно, само не мога да си обясня как когато заявката $chek е извън цикъла, всеки път $sportID взема следващата стойност
 
Така работи ли?
PHP:
$sportTYPE = $xmlDoc->getElementsByTagName( "sport" );
 function Verify($sportID,$sportname)
 {       
    $chek = mysql_query("SELECT * FROM `sport` WHERE `id`='{$sportID}' and `name`='{$sportname}';")or die(mysql_error());       
    return mysql_num_rows($chek)? 1 : 0;
 }
foreach ($sportTYPE as $sportTYPE) {

 $sportID =  $sportTYPE->getAttribute('id');
 $sportname =  $sportTYPE->getAttribute('name');
        echo "Евент: $sportID - $sportname <br>";
if(Verify($sportID,$sportname) == 1)
                {
                        echo "Има запис";
                }else {
      $add = "INSERT INTO sport (id, name) VALUES ('$sportID', '$sportname')";
$query = mysql_query($add);
      }
?>
 
Пропуснал си да прочетеш ЕДИТА ми :D

EDIT: Преместих
function Verify($sportID,$sportname)
{
$chek = mysql_query("SELECT * FROM `sport` WHERE `id`='{$sportID}' and `name`='{$sportname}';")or die(mysql_error());
return mysql_num_rows($chek)? 1 : 0;
}

точно над foreach и заработи правилно, само не мога да си обясня как когато заявката $chek е извън цикъла, всеки път $sportID взема следващата стойност
 
Защото в if викаш функцията, която ти връща определен резултат 0 или 1 съм го направил. Ако е единица значи има запис и няма да записваш. Функцията има два параметъра които приема и обработва. Затова работи. :)
 

Back
Горе