IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Erreur lors d'exécution d'une table sql


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut Erreur lors d'exécution d'une table sql
    Bonjour.

    J'ai cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE TABLE [dbo].[latest_info](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[type] [varchar](20) NULL,
    	[number] [varchar](255) NULL,
    	[url] [varchar](255) NULL,
    	[title] [varchar](255) NULL,
    	[text] [text] NULL,
    	[author] [varchar](50) NULL,
    	[icon] [varchar](50) NULL,
    	[publish_date] [bigint] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[latest_info] ADD  DEFAULT (datediff_big(millisecond,'1970-01-01 00:00:00',getutcdate())) FOR [publish_date]
    GO
    Lorsque j'essaye de prendre la valeur de la date en PHP, ça dit que c'est un "object" et pas un "string".

    Je ne me rappelle plus de l'astuce à ajouter à la DB qui résoud ce problème.

    Merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Une seule fois lors de la connexion
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE, false); // la solution
     
    // Ensuite, toutes vos requêtes fonctionnent automatiquement
    $stmt = $pdo->query("SELECT * FROM latest_info");
    $row = $stmt->fetch();
    echo $row['publish_date']; // String automatiquement
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut
    Merci.

    Ta solution est simple.

    Par contre je vois ça sur google

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function connect()
    {
     
        $c_host2                    = 'VMI48950\SQLEXPRESS';
        $config1['UID']             = 'sa';
        $config1['PWD']             = 'pass';
        $config1['Database']        = 'Db';
        $config1['CharacterSet']    = 'UTF-8';
        $config1['ReturnDatesAsStrings'] = true;
     
        $conn2 = sqlsrv_connect($c_host2, $config1);
        if(!$conn2) die('Error cnnetion DB.');
     
    }
    J'ai adapté, mais je pense que c'est faux

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 750
    Par défaut
    Oui c'est une autre solution (qui est incomplète, elle ne retourne rien).

    Si cette solution vous convient, utilisez-là ! Tant que ça fonctionne...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    # Connection
    $server = 'server\instance,port';
    $cinfo = array(
        "ReturnDatesAsStrings"=>false,
        "Database"=>'database',
        "UID"=>"uid",
        "PWD"=>"pwd"
    );
    $conn = sqlsrv_connect($server, $cinfo);
    if( $conn === false )
    {
        echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    La ya pas d'erreur je pense.

    Je continue à coder ce n'est pas fini.

    Je reviens vers vous quand j'ai un problème.

    Merci

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut
    Rebonjour.
    Je crois que le UNIX TIMESTAMP est faux.

    Dans la table sa me génére ça par exemple:
    1762687062220

    Alors que la valeur doit être plus courte et ressembler a ça :
    1762698820

    Possible d'avoir de l'aide svp car je comprends pas là.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    USE [Db_website]
     
    CREATE TABLE [dbo].[latest_info](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[type] [varchar](20) NULL,
    	[number] [varchar](255) NULL,
    	[url] [varchar](255) NULL,
    	[title] [varchar](255) NULL,
    	[text] [text] NULL,
    	[author] [varchar](50) NULL,
    	[icon] [varchar](50) NULL,
    	[publish_date] [bigint] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[latest_info] ADD  DEFAULT (datediff_big(millisecond,'1970-01-01 00:00:00',getutcdate())) FOR [publish_date]
    GO

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 750
    Par défaut
    Votre formule calcule les millisecondes depuis 1970, alors qu'un timestamp UNIX standard est en secondes.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut
    Comment puis je faire pour avoir en seconde svp car c'est une valeur auto je veux pas la créer.

    C'est un gain de temps et de code.

    Merci

  9. #9
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2020
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2020
    Messages : 91
    Par défaut
    J'ai trouvé.

    Voila la requete final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE [dbo].[latest_info](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [type] varchar(255) NULL,
    [number] varchar(255) NULL,
    [url] varchar(255) NULL,
    [title] varchar(255) NULL,
    [text] [text] NULL,
    [publish_date] BIGINT DEFAULT (DATEDIFF_BIG(SECOND, '1970-01-01 00:00:00', GETUTCDATE())),
    [author] varchar(255) NULL,
    [icon] varchar(255) NULL,
    PRIMARY KEY CLUSTERED ([id] ASC)
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    Qu'en pensez vous ?

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 750
    Par défaut
    c'est ok
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 021
    Billets dans le blog
    6
    Par défaut
    ATTENTION ! UNIX timestamp (en fait epoch) n'est absolument pas une mesure de date/heure... Vous devez donc le stocker en INT. C'est une quantité de secondes depuis 1970.

    Voici ce que je dis dans mon dernier livres sur SQL :
    https://sqlpro.developpez.com/livre/...aleurs-et-null

    Le type « epoch », propre à Linux, et que bon nombre de développeurs préfèrent en lieu et place d’un type SQL temporel comme TIMESTAMP n’a rien à voir avec une date (c’est une durée théorique) et donne des résultats faux ! En effet, UNIX a été construit sur une affirmation fausse qui prétend que tous les jours ont 86 400 secondes. Or du fait de la seconde intercalaire, ce calcul est erroné car « epoch » compte le temps comme une durée et non comme une date… De plus ce type est limité aux dates allant du 1/1/1970 au 19/1/2038 à 3h14m8s…

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Erreur lors d'un update d'une table sql serveur en liaison ODBC avec SAS
    Par wizou44 dans le forum Administration et Installation
    Réponses: 5
    Dernier message: 25/05/2009, 10h44
  2. Réponses: 2
    Dernier message: 09/06/2008, 22h51
  3. Erreur lors la lecture d'une table PostgreSQL
    Par choko83 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 30/04/2008, 15h56
  4. Erreur lors d'insertion dans une table avec Indentity
    Par rad_hass dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/03/2008, 16h22
  5. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo